/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom, 2011
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JKKOpNaiyoStkuCC
 *   ソースファイル名：JKKOpNaiyoStkuCC.java
 *   作成者          ：富士通
 *   日付            ：2012年12月16日
 *＜機能概要＞
 *   KKW02301オプションサービス一覧画面のオプション内容を取得するクラス。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2012/12/16   FJ）        新規作成
 *   v4.00.00    2012/10/29   FJ）大木    フェムトセル
 *   v8.00.00    2014/01/09   HJ) 齋藤    2014/01/09 ANK-1586-00-00 フェムトセル対応(docomo)
 *   v13.00.00   2015/03/25   FJ) 寺園    IT1-2015-0000039 オプションチャンネル名不正
 *   v32.00.00	 2017/04/10   FJ) 中原	【ANK-3149-00-00】新セキュリティパック導入
 *   v39.00.00   2018/09/26   FJ) 前田   【ANK-3484-00-00】端末補償サービス導入対応
 *   v39.00.00   2018/10/17   FJ) 松尾    IT1-2018-0000164 住所変更初期表示エラー
 *   v39.00.00   2018/10/26   FJ) 吉田    IT1-2018-0000191 おうちの機器端末補償表示不正
 *   v39.00.01   2018/11/02   FJ) 山地    IT1-2018-0000191 おうちの機器端末補償表示不正
 *   v50.00.00   2020/06/03   FJ) 平野   【ANK-3754-00-00】トビラフォン対応
 *   v52.00.00   2021/01/25   FJ) 吉村   【ANK-3987-00-00】Netflix導入対応（STEP2）
 *   v59.00.00   2022/05/30   FJ) 吉村   【ANK-4243-00-00】オプションチャンネル追加対応（レジャーチャンネル）
 *   v73.00.00   2024/08/02   FJ) 中川   【ANK-4427-00-00】NTT卸対応
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.common.JKKTmcpOperateCC;
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.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.sc.exception.SCException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0241B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0241B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0361A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0371A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0371A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0381A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0381A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0411D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0171B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0171B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
 * 
 * オプション内容取得CCクラス
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JKKOpNaiyoStkuCC extends AbstractCommonComponent
{


	/** サービスコード ネット系オプションサービス(オプションサービス契約<ISP>一意照会) **/
	private static final String[] OPSVC_CD_NET = 
	{
		"B001","B002","B003","B004","B005","B010","B011","B014","B012","B013","B015","B016","B018",
		// ANK-3484-00-00 2018/09/26 MOD START
		// ANK-3149-00-00 2017/04/10 MOD START
//		"B020","B070","B075"
//		"B020","B070","B075","B130","B131","B132"
		// ANK-4427-00-00 MOD START
//		"B020","B070","B075","B130","B131","B132","B133","B134"
		"B020","B070","B075","B130","B131","B132","B133","B134","B138"
		// ANK-4427-00-00 MOD END
		// ANK-3149-00-00 2017/04/10 MOD END
		// ANK-3484-00-00 2018/09/26 MOD END
	};

	/** サービスコード 電話系オプションサービス(オプションサービス契約<電話>一意照会) **/
	private static final String[] OPSVC_CD_TEL = 
	{
		// ANK-3754-00-00 MOD START 
// 		"B029","B072"	
		"B029","B072","B135"
		// ANK-3754-00-00 MOD END 
	};

	/** サービスコード eo光テレビケーブルテレビガイド誌(オプションサービス契約<TV>一意照会) **/
	private static final String[] OPSVC_CD_TV = 
	{
		"B068","B069"
	};

	/** サービスコード eo光テレビオプションチャンネル(オプションサービス一意照会) **/
	private static final String[] OPSVC_CD_TVOPTION = 
	{
		"B032","B033","B034","B035","B036","B037","B038","B039","B040","B041","B042","B043","B044",
		"B045","B046","B047","B048","B049","B050","B051","B052","B053","B054","B055","B056","B057",
		// ▼▼▼▼▼ 2015/03/25 IT1-2015-0000039 オプションチャンネル名不正 MOD START ▼▼▼▼▼
//		"B058","B059","B060","B061","B062","B063","B064","B065","B066","B067"
		// ANK-4243-00-00 MOD START
//		"B058","B059","B060","B061","B062","B063","B064","B065","B066","B067","B118"
		"B058","B059","B060","B061","B062","B063","B064","B065","B066","B067","B118","B137"
		// ANK-4243-00-00 MOD END 
		// ▼▼▼▼▼ 2015/03/25 IT1-2015-0000039 オプションチャンネル名不正 MOD END ▼▼▼▼▼
	};

	/** サービスコード 「有」を表示するもの **/
	private static final String[] OPSVC_CD_ARI = 
	{
		//ANK-3987-00-00 MOD START
	//	"B012","B013","B016","B021","B023","B024","B025","B026","B027","B028","B071","B077"
		"B012","B013","B016","B021","B023","B024","B025","B026","B027","B028","B071","B077","B136"
		//ANK-3987-00-00 MOD END
	};

	/** 有　文言 **/
	private static final String ARI = "有";

	/** SC呼び出し部品 */
	private ServiceComponentRequestInvoker scCall = null;

	/** 条件が揃っていないため、発行待ち　文言 **/
	private static final String IPV6_NOTHING = "条件が揃っていないため、発行待ち";

// ▼▼▼▼▼ 削除 ▼▼▼▼▼
//	/** 異動予約詳細詳細コード：016 オプション解約 */
//	private static final String IDO_RSV_DTL_CD_016 = "016";
//	/** 異動予約詳細詳細コード：018 サブオプション解約 */
//	private static final String IDO_RSV_DTL_CD_018 = "018";
//	/** 利用終了予定日：016 */
//	private static final String OPSVC_END_RSV_YMD = "opsvc_end_rsv_ymd";
// ▲▲▲▲▲ 削除 ▲▲▲▲▲

	/** 異動予約存在フラグ  0：なし  1：あり */
	private static final String IDO_RSV_FLG = "ido_rsv_flg";

	/** 異動予約状態コード：00 */
	private static final String IDO_RSV_STAT_CD_00 = "00";
	/** 異動予約状態コード：01 */
	private static final String IDO_RSV_STAT_CD_01 = "01";
	/** 異動予約状態コード：03 */
	private static final String IDO_RSV_STAT_CD_03 = "03";

	/** テンプレートID：オプションサービス契約＜ISP＞一意照会 */
	private static final String TEMPLATE_ID_EKK0361A010 = "EKK0361A010";
	/** テンプレートID：オプションサービス契約＜電話＞一意照会 */
	private static final String TEMPLATE_ID_EKK0371A010 = "EKK0371A010";
	/** テンプレートID：オプションサービス契約＜TV＞一意照会 */
	private static final String TEMPLATE_ID_EKK0381A010 = "EKK0381A010";
	/** テンプレートID：サービス契約回線内訳一覧照会 */
	private static final String TEMPLATE_ID_EKK0241B001 = "EKK0241B001";
	/** テンプレートID：コード名称管理一覧照会 */
	private static final String TEMPLATE_ID_EZM0171B010 = "EZM0171B010";
	/** テンプレートID：業務パラメータ管理一意照会 */
	private static final String TEMPLATE_ID_EZM0321A010 = "EZM0321A010";
	/** テンプレートID：異動予約一覧照会 */
	private static final String TEMPLATE_ID_EKK1681B001 = "EKK1681B001";

	/** インプットキー：ソート項目 */
	private static final String IN_KEY_SORT_ITEM = "sort_item";
	/** インプットキー：ソート区分 */
	private static final String IN_KEY_SORT_KBN  = "sort_kbn";

	/** ソート項目（オプション内容） */
	private static final String SORT_ITEM_OP_NAIYO = "3";

	/** ソート区分 */
	private static final String SORT_KBN_ASC  = "1";
	private static final String SORT_KBN_DESC = "2";

	/** ソートキー：ＡＳＣ */
	private static final String SORT_ASC  = "_asc";
	/** ソートキー：ＤＥＳＣ */
	private static final String SORT_DESC = "_desc";

	/******************************************************************************/
	/** メイン処理                                                               **/
	/******************************************************************************/
	/**
	 * オプション内容取得処理<br>
	 * <br>
	 * @param	handle		セッションハンドル
	 * @param	param		リクエストパラメータ
	 * @param	fixedText	サービスメッセージ
	 * @return				リクエストパラメータ
	 * @throws	Throwable	例外時にスローします
	 */
	public IRequestParameterReadWrite getOpNaiyoStku(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			String fixedText
	) throws Throwable
	{
		HashMap<String, Object>       eKK0361A010Map;
		List<HashMap<String, String>> eKK0351B002CBSMsg1List;
		HashMap<String, String>       eKK0351B002CBSMsg1ListElement;

		// SC呼び出し部品を生成
		scCall = new ServiceComponentRequestInvoker();

		// オプションサービス契約一覧照会の結果マップを取得
		eKK0361A010Map = (HashMap<String, Object>)param.getData(fixedText);

		// 一覧の明細リストを取得
		eKK0351B002CBSMsg1List = (List<HashMap<String, String>>)eKK0361A010Map.get(EKK0351B002CBSMsg.EKK0351B002CBSMSG1LIST);

		// 業務パラメータ管理一意照会を実施し、メーリングリストのドメインを取得する
		String mlListDomain = null;
		HashMap<String, String> eZM0321A010CBSMsg1ListElement = callEZM0321A010(handle, param);
		if (eZM0321A010CBSMsg1ListElement != null)
		{
			mlListDomain = eZM0321A010CBSMsg1ListElement.get(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
		}

		// 明細分ループ
		for(int i = 0 ; i < eKK0351B002CBSMsg1List.size() ; i ++)
		{
			// 1件分取得
			eKK0351B002CBSMsg1ListElement = eKK0351B002CBSMsg1List.get(i);

			// オプション内容抽出処理呼び出し
			// ANK-3484-00-00 2018/10/05 MOD START
			//getOpNaiyoChsht(eKK0351B002CBSMsg1ListElement, handle, param, mlListDomain);
			getOpNaiyoChsht(eKK0351B002CBSMsg1ListElement, handle, param, mlListDomain, fixedText);
			// ANK-3484-00-00 2018/10/05 MOD END

			// 異動予約一覧照会
			// ▼▼▼▼▼ IT1-2018-0000191 ADD START ▼▼▼▼▼
			//callEKK1681B002Type(eKK0351B002CBSMsg1ListElement, handle, param, mlListDomain);
			callEKK1681B002Type(eKK0351B002CBSMsg1ListElement, handle, param, mlListDomain, fixedText);
			// ▼▼▼▼▼ IT1-2018-0000191 ADD END ▼▼▼▼▼
		}

		// オプションサービス契約が存在する場合
		if (eKK0351B002CBSMsg1List.size() > 0)
		{
			// ソート項目確認
			String sortItem = (String)eKK0361A010Map.get(IN_KEY_SORT_ITEM);
			// ソート区分取得
			String sortKbn  = (String)eKK0361A010Map.get(IN_KEY_SORT_KBN);

			// ソート項目が「オプション内容」の場合
			if (SORT_ITEM_OP_NAIYO.equals(sortItem))
			{
				// ソート
				KKSV0043Comparator comp = new KKSV0043Comparator();

				// 指定されたソートキーを第一キーにセット
				if (SORT_KBN_DESC.equals(sortKbn))
				{
					comp.setSortKey(EKK0351B002CBSMsg1List.OP_SVC_NIY + SORT_DESC);
				}
				else if (SORT_KBN_ASC.equals(sortKbn))
				{
					comp.setSortKey(EKK0351B002CBSMsg1List.OP_SVC_NIY + SORT_ASC);
				}
				// 世代登録年月日を第二キーにセット
				comp.setSortSubKey(EKK0351B002CBSMsg1List.GENE_ADD_DTM + SORT_DESC);
				Collections.sort(eKK0351B002CBSMsg1List, comp);
			}
		}

		// 処理終了
		return param;
	}

	/**
	 * オプション内容抽出処理<br>
	 * <br>
	 * @param	eKK0351B002CBSMsg1ListElement	オプションサービス契約一覧照会（サービス契約番号）明細データ
	 * @param	handle							セッションハンドル
	 * @param	param							リクエストパラメータ
	 * @param	mlListDomain					メーリングリストドメイン
	 */
	private void getOpNaiyoChsht(
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			SessionHandle handle, 
			IRequestParameterReadWrite param,
			String mlListDomain,
			String fixedText
	) throws RequestParameterException,SCException
	{
		String opSvcCd;

		// オプションサービスコードの取得
		opSvcCd = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_CD);

		//--パターンの分岐
		// 単純に「有」と表示すればよいパターン
		for(int i = 0 ; i < OPSVC_CD_ARI.length ; i ++)
		{
			if(opSvcCd.equals(OPSVC_CD_ARI[i]))
			{
				// 「有」を設定
				eKK0351B002CBSMsg1ListElement.put(EKK0351B002CBSMsg1List.OP_SVC_NIY, ARI);
				return;
			}
		}

		// サービスコード ネット系オプションサービス(オプションサービス契約<ISP>一意照会)
		for(int i = 0 ; i < OPSVC_CD_NET.length ; i ++)
		{
			if(opSvcCd.equals(OPSVC_CD_NET[i]))
			{
				callEKK0361A010Type(eKK0351B002CBSMsg1ListElement, handle, param, mlListDomain, fixedText);
				return;
			}
		}

		// サービスコード 電話系オプションサービス(オプションサービス契約<電話>一意照会)
		for(int i = 0 ; i < OPSVC_CD_TEL.length ; i ++)
		{
			if(opSvcCd.equals(OPSVC_CD_TEL[i]))
			{
				callEKK0371A010Type(eKK0351B002CBSMsg1ListElement, handle, param);
				return;
			}
		}

		// サービスコード eo光テレビケーブルテレビガイド誌(オプションサービス契約<TV>一意照会)
		for(int i = 0 ; i < OPSVC_CD_TV.length ; i ++)
		{
			if(opSvcCd.equals(OPSVC_CD_TV[i]))
			{
				callEKK0381A010Type(eKK0351B002CBSMsg1ListElement, handle, param);
				return;
			}
		}

		// サービスコード eo光テレビオプションチャンネル(オプションサービス一意照会)
		for(int i = 0 ; i < OPSVC_CD_TVOPTION.length ; i ++)
		{
			if(opSvcCd.equals(OPSVC_CD_TVOPTION[i]))
			{
				callEKK0821A010Type(eKK0351B002CBSMsg1ListElement, handle, param);
				return;
			}
		}

		// ここまででどこにも該当しないオプションサービスコードについては「有」を固定設定
		eKK0351B002CBSMsg1ListElement.put(EKK0351B002CBSMsg1List.OP_SVC_NIY, ARI);
	}

	/******************************************************************************/
	/** 共通処理                                                                 **/
	/******************************************************************************/
	/**
	 * S-I/F共通処理<br>
	 * <br>
	 * @param	handle		セッションハンドル
	 * @param	param		リクエストパラメータ
	 * @param	template
	 */
	private CAANMsg[] callCmn(
			SessionHandle handle, 
			IRequestParameterReadWrite param,
			CAANMsg template
	) throws RequestParameterException,SCException
	{
		HashMap<String, Object> sIFRequest;
		Map<?, ?> sIFResult;
		CAANMsg[] templates;
		Object return_code;
		Object obj;

		// 上り情報を生成
		sIFRequest = editInMsgCmn(param, template);

		// SIF呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// 結果取得
		// SCからの戻り値からCAANMsgを取得する。
		templates = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// リターンコード取得
		return_code = sIFResult.get(JCMConstants.RET_CD_INT_KEY);
		if(!return_code.equals(Integer.parseInt("0")))
		{
			// エラーの場合は何もしない
			return null;
		}

		obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			// エラーの場合は何もしない
			return null;
		}

		return templates;
	}

	/******************************************************************************/
	/** ネット                                                                   **/
	/******************************************************************************/
	/**
	 * ネット系オプションサービス(オプションサービス契約<ISP>一意照会)<br>
	 * <br>
	 * @param	eKK0351B002CBSMsg1ListElement	オプションサービス契約一覧照会（サービス契約番号）明細データ
	 * @param	handle							セッションハンドル
	 * @param	param							リクエストパラメータ
	 * @param	mlListDomain					メーリングリストドメイン
	 */
	private void callEKK0361A010Type(
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			SessionHandle handle, 
			IRequestParameterReadWrite param,
			String mlListDomain,
			// ANK-3484-00-00 2018/10/05 ADD START
			String fixedText
			// ANK-3484-00-00 2018/10/05 ADD END
	) throws RequestParameterException,SCException
	{
		HashMap<String, String> eKK0361A010Msg1ListElement;
		String opSvcCd;

		// オプションサービスコードの取得
		opSvcCd = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_CD);

		// サービス(オプションサービス契約<ISP>一意照会の結果取得
		eKK0361A010Msg1ListElement = callEKK0361A010(
				eKK0351B002CBSMsg1ListElement,
				handle,
				param
		);

		// レコードが無いorエラーの場合は何もしない
		if(eKK0361A010Msg1ListElement == null)
		{
			return;
		}

		// オプションサービスコードによる分岐
		if("B001".equals(opSvcCd))
		{
			// Ｅメール　：　メールアドレス
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.MLAD))
			);
		}
		else if("B002".equals(opSvcCd))
		{
			// Ｍｙホームページ　：　URL(ドメイン) URL(アカウント)
			if(
					eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.URL_ACCOUNT) != null
					&& eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.URL_DOMAIN) != null
			)
			{
				//↓↓↓2012-04-18更新　ST2-2012-0000664対応↓↓↓
				StringBuilder url = new StringBuilder();
				url.append(toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.URL_DOMAIN)));
				url.append(toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.URL_ACCOUNT)));

				eKK0351B002CBSMsg1ListElement.put(
						EKK0351B002CBSMsg1List.OP_SVC_NIY,
						url.toString()
				);
				//↑↑↑2012-04-18更新　ST2-2012-0000664対応↑↑↑
			}

		}
		else if("B003".equals(opSvcCd))
		{
			// メーリングリスト　：　メーリングリスト名
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.MLLIST_NM)) +
					"@" +
					toDesc(mlListDomain)
			);
		}
		else if("B004".equals(opSvcCd))
		{
			// 固定グローバルＩＰアドレス　：　固定IPアドレス
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.KOTEI_IP_AD))
			);
		}
		else if("B005".equals(opSvcCd))
		{
			// ＳＯＨＯパック１０　：　独自ドメイン名
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.DOKUJI_DOMAIN_NM))
			);
		}
		else if("B010".equals(opSvcCd))
		{
			// ダイヤルパッド　：　ダイヤルパッドID
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.DPAD_ID))
			);
		}
		else if("B011".equals(opSvcCd))
		{
			// ＴＥＬｖｉｓｉｏｎ　：　VoIPユーザーID
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.VOIP_USER_ID))
			);
			// 2013/8/1 IT1-2013-0001558 Add Start
			// ＴＥＬｖｉｓｉｏｎ　：　公衆網電話番号
			eKK0351B002CBSMsg1ListElement.put(
					EKK0361A010CBSMsg1List.KOSHUMO_TELNO,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.KOSHUMO_TELNO))
			);
			// 2013/8/1 IT1-2013-0001558 Add End
		}
		else if("B014".equals(opSvcCd))
		{
			// ｅｏ−ｎｅｔフォン　：　VoIPユーザーID
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.VOIP_USER_ID))
			);
			// 2013/8/1 IT1-2013-0001558 Add Start
			// ｅｏ−ｎｅｔフォン　：　公衆網電話番号
			eKK0351B002CBSMsg1ListElement.put(
					EKK0361A010CBSMsg1List.KOSHUMO_TELNO,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.KOSHUMO_TELNO))
			);
			// 2013/8/1 IT1-2013-0001558 Add End
		}
		else if("B015".equals(opSvcCd))
		{
			// マルチセッション　：　マルチセッション用認証ID
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.MLTISE_NINSHO_ID))
			);
		}
		else if("B018".equals(opSvcCd))
		{
			// グループコミュニティ　：　WISHオーナーID
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.WISH_OWNR_ID))
			);
		}
		else if("B020".equals(opSvcCd))
		{
			// ダイヤルアップ接続　：　ダイヤルアップ接続用認証ID
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.DUPCON_NINSHO_ID))
			);
		}
		else if("B070".equals(opSvcCd))
		{
			// ＩＰｖ６アドレスが設定されている場合はＩＰｖ６アドレスを表示。
			if(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.IPV6_AD_IFID) != null)
			{
				// ＩＰｖ６アドレス
				eKK0351B002CBSMsg1ListElement.put(
						EKK0351B002CBSMsg1List.OP_SVC_NIY,
						toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.IPV6_AD_IFID))
				);
			}
			else
			{
				// 固定文言　条件が揃っていないため、発行待ち
				eKK0351B002CBSMsg1ListElement.put(
						EKK0351B002CBSMsg1List.OP_SVC_NIY,
						IPV6_NOTHING
				);
			}
		}
		// ▼▼▼▼▼ 2012/10/29 IT1-2012-0001744 ADD START ▼▼▼▼▼
		else if ("B075".equals(opSvcCd))
		{
			// フェムトセル　：　フェムトセル用認証ＩＤ
			
		// ▼▼▼▼▼ 2014/01/09 ANK-1586-00-00 フェムトセル対応(docomo) MOD START ▼▼▼▼▼
		//		eKK0351B002CBSMsg1ListElement.put(
		//		EKK0351B002CBSMsg1List.OP_SVC_NIY,
		//		toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.FMTCEL_NINSHO_ID))
		//		);
		//}
		// ▲▲▲▲▲ 2012/10/29 IT1-2012-0001744 ADD E N D ▲▲▲▲▲
		// ▲▲▲▲▲ 2014/01/09 ANK-1586-00-00 フェムトセル対応(docomo) MOD END ▲▲▲▲▲
			
			// ▼▼▼▼▼ 2014/01/09 ANK-1586-00-00 フェムトセル対応(docomo) ADD START ▼▼▼▼▼
			//フェムトセル認証ID　フェムトセル事業者名称が両方取得できる場合(docomo以外)
			if(	eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.FMTCEL_NINSHO_ID) != null
				&& eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.FMTCEL_JGS_CD_NM) != null
			)
			{
				StringBuilder fmtcel_IdNm = new StringBuilder();
				//フェムトセル認証ID　+"半角スペース"　
				fmtcel_IdNm.append(toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.FMTCEL_NINSHO_ID))+" "); 
				//フェムトセル事業者名称
				fmtcel_IdNm.append(toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.FMTCEL_JGS_CD_NM)));
				
				eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					fmtcel_IdNm.toString()
				);
			}
			//フェムトセル認証IDが取得できない場合(docomo)
			else 
			//if (eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.FMTCEL_NINSHO_ID) == null)
			{
				//フェムトセル事業者名称のみをオプション内容に詰める
				eKK0351B002CBSMsg1ListElement.put(
						EKK0351B002CBSMsg1List.OP_SVC_NIY,
						toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.FMTCEL_JGS_CD_NM))
						);	
			}
			String fmtcel_jgs_cd = (eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.FMTCEL_JGS_CD));
		}	
		// ▲▲▲▲▲ 2014/01/09 ANK-1586-00-00 フェムトセル対応(docomo) END  ▲▲▲▲▲
		// ANK-3149-00-00 2017/04/10 ADD START
		else if ("B130".equals(opSvcCd))
		{
			// マカフィー用認証メールアドレス/マカフィー用認証パスワード
			if(	eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.MCAFEE_NINSHO_MLAD) != null
				&& eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.MCAFEE_NINSHO_PWD) != null
			)
			{
				StringBuilder Mcfee_MladPwd = new StringBuilder();
				//マカフィー用認証メールアドレス　+"/"　
				Mcfee_MladPwd.append(toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.MCAFEE_NINSHO_MLAD))+"/"); 
				//マカフィー用認証パスワード
				Mcfee_MladPwd.append(toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.MCAFEE_NINSHO_PWD)));
				
				eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					Mcfee_MladPwd.toString()
				);
			}
		}	
		else if ("B131".equals(opSvcCd))
		{
			// サブスクリプションID
			if(	eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.SBSCPT_ID) != null )
			{
				//サブスクリプションID　
				eKK0351B002CBSMsg1ListElement.put(
						EKK0351B002CBSMsg1List.OP_SVC_NIY,
						toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.SBSCPT_ID))
						);

			}
		}	
		else if ("B132".equals(opSvcCd))
		{
			// ユーザーサブスクリプションPIN
			if(	eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.USER_SBSCPT_PIN) != null )
			{
				//ユーザーサブスクリプションPIN
				eKK0351B002CBSMsg1ListElement.put(
						EKK0351B002CBSMsg1List.OP_SVC_NIY,
						toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.USER_SBSCPT_PIN))
						);

			}
		}	
		// ANK-3149-00-00 2017/04/10 ADD END
		// ANK-3484-00-00 2018/09/26 ADD START
		else if ("B133".equals(opSvcCd) || "B134".equals(opSvcCd))
		{
			try
			{
				// ＰＣプランマップ
				HashMap<String, Object> pcPlanMap = new HashMap<String, Object>();
				// ＰＣワイドプランマップ
				HashMap<String, Object> pcwPlanMap = new HashMap<String, Object>();
				// ＴＶプランマップ
				HashMap<String, Object> tvPlanMap = new HashMap<String, Object>();
				// 機器補償プランマップ
				HashMap<String,HashMap<String, Object>> kikiHoshoPlanMap = new HashMap<String,HashMap<String, Object>>();
				// 取得データを格納
				kikiHoshoPlanMap = runJKKTmcpOperateCC(param, handle, eKK0351B002CBSMsg1ListElement, fixedText);
				
				// 各プランマップの取得
				pcPlanMap = kikiHoshoPlanMap.get("pc_plan_map");
				pcwPlanMap = kikiHoshoPlanMap.get("pc_wide_plan_map");
				tvPlanMap = kikiHoshoPlanMap.get("tv_plan_map");
				
				// "サービスコードがB133の場合"
				if ("B133".equals(opSvcCd))
				{
					
					if (pcwPlanMap != null)
					{
						// ＰＣワイドプランが未登録、もしくはワイドプランが解約、キャンセル済の場合
						if ((pcwPlanMap.size() == 0)
							|| JKKStrConst.CD00037_DSL_ZM.equals(pcwPlanMap.get("sbop_svc_kei_stat"))
							|| JKKStrConst.CD00037_CANCEL_ZM.equals(pcwPlanMap.get("sbop_svc_kei_stat"))
							)
						{
							StringBuilder pc_Plan_Niy = new StringBuilder();
							
							// "ＰＣワイドプラン有無：無、"
							pc_Plan_Niy.append(toDesc(JKKStrConst.PC_WIDE_PLAN_UM + "：無、"));
							// "利用開始日：-、"
							pc_Plan_Niy.append(toDesc(JKKStrConst.SVC_STA_YMD + "：-、"));
							// "機器補償：残" +　+ "回、"
							if(pcPlanMap.get("kiki_comps_zan_use_cnt") != null)
							{
								pc_Plan_Niy.append(toDesc(JKKStrConst.KIKI_HOSHO + "：残" + pcPlanMap.get("kiki_comps_zan_use_cnt")) + "回、");
							}
							else
							{
								pc_Plan_Niy.append(toDesc(JKKStrConst.KIKI_HOSHO + "：-、"));
							}
							// "データ復旧：残" +　+ "回"
							if(pcPlanMap.get("data_fukkyu_zan_use_cnt") != null)
							{
								pc_Plan_Niy.append(toDesc(JKKStrConst.DATA_HUKKYU + "：残" + pcPlanMap.get("data_fukkyu_zan_use_cnt")) + "回");
							}
							else
							{
								pc_Plan_Niy.append(toDesc(JKKStrConst.DATA_HUKKYU +  "：-"));
							}
							
							eKK0351B002CBSMsg1ListElement.put(
									EKK0351B002CBSMsg1List.OP_SVC_NIY,
									pc_Plan_Niy.toString()
									);
							
							// "おうちの機器補償" + "　" + ＰＣプラン
							eKK0351B002CBSMsg1ListElement.put(
									EKK0351B002CBSMsg1List.OP_SVC_CD_NM,
									toDesc(JKKStrConst.HOUSE_KIKI_HOSHO + "　" + pcPlanMap.get("op_svc_cd_nm"))
									); 
						}
						// ＰＣワイドプランが登録されている場合
						else if("D12".equals(pcwPlanMap.get("sbop_svc_cd")))
						{
							StringBuilder pcw_Plan_Niy = new StringBuilder();
							
							// "ＰＣワイドプラン有無：有、"
							pcw_Plan_Niy.append(toDesc(JKKStrConst.PC_WIDE_PLAN_UM + "：有、"));

							// 利用開始日の判別
							if((JKKStrConst.CD00037_SVCTK_CHU.equals(pcwPlanMap.get("sbop_svc_kei_stat")))
									||  JKKStrConst.CD00037_STAT_PAUSE.equals(pcwPlanMap.get("sbop_svc_kei_stat"))
									||  JKKStrConst.CD00037_STAT_STP.equals(pcwPlanMap.get("sbop_svc_kei_stat"))
								)
							{
								if(pcwPlanMap.get("svc_staymd") != null)
								{
								// 日付をyyyy/mm/ddの表示形に変換
								String svcStaymdY = (pcwPlanMap.get("svc_staymd").toString()).substring(0,4);
								String svcStaymdM = (pcwPlanMap.get("svc_staymd").toString()).substring(4,6);
								String svcStaymdD = (pcwPlanMap.get("svc_staymd").toString()).substring(6);
								String svcStaYmd = (svcStaymdY + "/" + svcStaymdM + "/" + svcStaymdD);
								// 利用開始日 + "：" + yyyy/mm/dd + "、"
								pcw_Plan_Niy.append(toDesc(JKKStrConst.SVC_STA_YMD + "：" + svcStaYmd + "、")); 
								}
							}
							else
							{
								pcw_Plan_Niy.append(toDesc(JKKStrConst.SVC_STA_YMD + "：-、")); 
							}
							
							// "機器補償：残" +　+ "回、"
							if(pcPlanMap.get("kiki_comps_zan_use_cnt") != null)
							{
								pcw_Plan_Niy.append(toDesc(JKKStrConst.KIKI_HOSHO + "：残" + pcPlanMap.get("kiki_comps_zan_use_cnt")) + "回、");
							}
							else
							{
								pcw_Plan_Niy.append(toDesc(JKKStrConst.KIKI_HOSHO + "：-、"));
							}
							// "データ復旧：残" +　+ "回"
							if(pcPlanMap.get("data_fukkyu_zan_use_cnt") != null)
							{
								pcw_Plan_Niy.append(toDesc(JKKStrConst.DATA_HUKKYU + "：残" + pcPlanMap.get("data_fukkyu_zan_use_cnt")) + "回");
							}
							else
							{
								pcw_Plan_Niy.append(toDesc(JKKStrConst.DATA_HUKKYU + "：-"));
							}
							
							eKK0351B002CBSMsg1ListElement.put(
									EKK0351B002CBSMsg1List.OP_SVC_NIY,
									pcw_Plan_Niy.toString()
									);
							
							// "おうちの機器補償" + "　" + ＰＣワイドプラン
							eKK0351B002CBSMsg1ListElement.put(
									EKK0351B002CBSMsg1List.OP_SVC_CD_NM,
									toDesc(JKKStrConst.HOUSE_KIKI_HOSHO + "　" + pcwPlanMap.get("sbop_svc_cd_nm"))
									); 
						}
					}
				}
				
				// "サービスコードがB134の場合"
				if ("B134".equals(opSvcCd))
				{
					StringBuilder tv_Plan_Niy = new StringBuilder();
					
					// "機器補償：残" +　+ "回、"
					if(tvPlanMap.get("kiki_comps_zan_use_cnt") != null)
					{
						tv_Plan_Niy.append(toDesc(JKKStrConst.KIKI_HOSHO + "：残" + tvPlanMap.get("kiki_comps_zan_use_cnt")) + "回、");
					}
					else
					{
						tv_Plan_Niy.append(toDesc(JKKStrConst.KIKI_HOSHO + "：-、"));
					}
					// "データ復旧：残" +　+ "回"
					if(tvPlanMap.get("data_fukkyu_zan_use_cnt") != null)
					{
						tv_Plan_Niy.append(toDesc(JKKStrConst.DATA_HUKKYU + "：残" + tvPlanMap.get("data_fukkyu_zan_use_cnt")) + "回");
					}
					else
					{
						tv_Plan_Niy.append(toDesc(JKKStrConst.DATA_HUKKYU + "：-"));
					}
					
					eKK0351B002CBSMsg1ListElement.put(
							EKK0351B002CBSMsg1List.OP_SVC_NIY,
							tv_Plan_Niy.toString()
							);
					
					// "おうちの機器補償" + "　" + ＴＶプラン
					eKK0351B002CBSMsg1ListElement.put(
							EKK0351B002CBSMsg1List.OP_SVC_CD_NM,
							toDesc(JKKStrConst.HOUSE_KIKI_HOSHO + "　" + tvPlanMap.get("op_svc_cd_nm"))
							); 
				}
				
//2018/10/17 IT1-2018-0000164 住所変更初期表示エラー START
				String svcstaymd = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.SVC_STAYMD);
				
				if(svcstaymd != null)
				{
					eKK0351B002CBSMsg1ListElement.put(
							EKK0351B002CBSMsg1List.DSP_SVCTK_STAYMD,
							svcstaymd
							); 
				};
//2018/10/17 IT1-2018-0000164 住所変更初期表示エラー END
				
			}
			catch(Throwable e)
			{
				// サービスコードがB133、B134の処理でエラーとなった場合、システムエラーにしないために処理を行わない。
				return;
			}
		}
		// ANK-4427-00-00 ADD START
		else if ("B138".equals(opSvcCd))
		{
			// typeN電話番号　
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0361A010Msg1ListElement.get(EKK0361A010CBSMsg1List.TYPEN_TELNO))
					);
			
			// 表示用サービス提供開始年月日
			String dspsvcstaymd = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.DSP_SVCTK_STAYMD);
			String svcstaymd = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.SVC_STAYMD);
			if(JKKStringUtil.isNullBlank(dspsvcstaymd) && !JKKStringUtil.isNullBlank(svcstaymd))
			{
				eKK0351B002CBSMsg1ListElement.put(
						EKK0351B002CBSMsg1List.DSP_SVCTK_STAYMD,
						svcstaymd
						);
			};
		}	
		// ANK-4427-00-00 ADD END
	}
	
	/**
	 * オプション内容取得処理<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	handle		セッションハンドル
	 * @param	eKK0351B002CBSMsg1ListElement	eKK0351B002照会結果
	 * @param	fixedText	サービスメッセージ
	 * @return				リクエストパラメータ
	 * @throws	Throwable	例外時にスローします
	 */
	private HashMap<String,HashMap<String, Object>> runJKKTmcpOperateCC(
			IRequestParameterReadWrite param,
			SessionHandle handle, 
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			// ANK-3484-00-00 2018/10/05 ADD START
			String fixedText
			// ANK-3484-00-00 2018/10/05 ADD END
	) throws RequestParameterException,SCException
	{
		HashMap<String, Object> pcPlanMap = new HashMap<String, Object>();
		HashMap<String, Object> pcwPlanMap = new HashMap<String, Object>();
		HashMap<String, Object> tvPlanMap = new HashMap<String, Object>();
		
		//String fixedText = "KKSV004301SC";
		
		// サービスに渡す業務データを格納するMAP
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(fixedText, dataMap);
		}
		// 端末補償操作CCのin項目
		// 機能コード
		dataMap.put("func_cd", "1");
		// 運用日付
		String unyo_ymd = JCCBPCommon.getOpeDate(null);
		//Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
//		// 申込年月日
//		dataMap.put("mskm_ymd", unyo_ymd);
		// 処理区分
		dataMap.put("shori_div", "1");
//		// 異動区分
//		String idoDiv = "00002";
//		dataMap.put("ido_div", idoDiv);
		
		// サービス契約番号の取得
		//svcKeiNo = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.SVC_KEI_NO);
		String svcKeiNo = (String)dataMap.get("key_svc_kei_no");
		
		//2018/10/17 IT1-2018-0000164 住所変更初期表示エラー START
		if(svcKeiNo == null)
		{
			svcKeiNo = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.SVC_KEI_NO);
		}
	// v39.00.01 IT1-2018-0000191 ADD START
		String opSvcKeiNo_IN = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO);
	// v39.00.01 IT1-2018-0000191 ADD END
//2018/10/17 IT1-2018-0000164 住所変更初期表示エラー END
		
		dataMap.put("svc_kei_no", svcKeiNo);
		// v39.00.01 IT1-2018-0000191 ADD START
		dataMap.put("op_svc_kei_no", opSvcKeiNo_IN);
		// v39.00.01 IT1-2018-0000191 ADD END
		// サービス呼び出し
		JKKTmcpOperateCC jKKTmcpOperateCC = new JKKTmcpOperateCC();
		
		try
		{
			jKKTmcpOperateCC.main(handle, param, fixedText);
		}
		catch (Throwable e)
		{
			// 端末補償操作CCでエラーとなった場合、システムエラーにしないために処理を行わない。
			return null;
		}
		
		// 端末補償操作CCの実行結果の取得処理
		if(dataMap.containsKey("info_list"))
		{
			// 照会リスト
			HashMap<String, List<HashMap<String, Object>>> infoListMap = new HashMap<String, List<HashMap<String, Object>>>();
			// ＰＣプランリスト
			List<HashMap<String, Object>> pcPlanList = new ArrayList<HashMap<String, Object>>();
			// ＰＣワイドプランリスト
			List<HashMap<String, Object>> pcWidePlanList = new ArrayList<HashMap<String, Object>>();
			// ＴＶプランリスト
			List<HashMap<String, Object>> tvPlanList = new ArrayList<HashMap<String, Object>>();
			// ▼▼▼▼▼ IT1-2018-0000191 ADD START ▼▼▼▼▼
			// オプションサービス契約番号
			String opSvcKeiNo = "";
			
			if (eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO) != null)
			{
				opSvcKeiNo = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO);
			}
			// ▲▲▲▲▲ IT1-2018-0000191 ADD END ▲▲▲▲▲
			
			if (dataMap.get("info_list") != null)
			{
				// 照会リストの取得
				infoListMap = (HashMap<String, List<HashMap<String, Object>>>)dataMap.get("info_list");
				
				// ＰＣプランリストの取得
				if (infoListMap.get("pc_plan_list") != null)
				{
					pcPlanList = infoListMap.get("pc_plan_list");
					if (pcPlanList.size() != 0)
					{
						// ＰＣプランマップの取得
						// ▼▼▼▼▼ IT1-2018-0000191 MOD START ▼▼▼▼▼
//						pcPlanMap = pcPlanList.get(0)
						for (int i = 0; i < pcPlanList.size(); i++)
						{
							if (opSvcKeiNo.equals(pcPlanList.get(i).get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO)))
							{
								pcPlanMap = pcPlanList.get(i);
							}
						}
						// ▲▲▲▲▲ IT1-2018-0000191 MOD END ▲▲▲▲▲
					}
				}
				
				// ＰＣワイドプランリストの取得
				if (infoListMap.get("pc_wide_list") != null)
				{
					pcWidePlanList = infoListMap.get("pc_wide_list");
					if (pcWidePlanList.size() != 0)
					{
						// ＰＣワイドプランマップの取得
						// ▼▼▼▼▼ IT1-2018-0000191 MOD START ▼▼▼▼▼
//						pcwPlanMap = pcWidePlanList.get(0);
						for (int i = 0; i < pcWidePlanList.size(); i++)
						{
							if (opSvcKeiNo.equals(pcWidePlanList.get(i).get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO)))
							{
								pcwPlanMap = pcWidePlanList.get(0);
							}
						}
						// ▲▲▲▲▲ IT1-2018-0000191 MOD END ▲▲▲▲▲
					}
				}
				
				// ＴＶプランリストの取得
				if (infoListMap.get("tv_plan_list") != null)
				{
					tvPlanList = infoListMap.get("tv_plan_list");
					if (tvPlanList.size() != 0)
					{
						// ＴＶプランマップの取得
						// ▼▼▼▼▼ IT1-2018-0000191 MOD START ▼▼▼▼▼
//						tvPlanMap = tvPlanList.get(0);
						for (int i = 0; i < tvPlanList.size(); i++)
						{
							if (opSvcKeiNo.equals(tvPlanList.get(i).get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO)))
							{
								tvPlanMap = tvPlanList.get(0);
							}
						}
						// ▲▲▲▲▲ IT1-2018-0000191 MOD END ▲▲▲▲▲
					}
				}
			}
			
			// 機器補償プランマップ
			HashMap<String,HashMap<String, Object>> kikiHoshoPlanMap = new HashMap<String,HashMap<String, Object>>();
			// ＰＣプランマップを格納
			kikiHoshoPlanMap.put("pc_plan_map", pcPlanMap);
			// ＰＣワイドプランマップを格納
			kikiHoshoPlanMap.put("pc_wide_plan_map", pcwPlanMap);
			// ＴＶプランマップを格納
			kikiHoshoPlanMap.put("tv_plan_map", tvPlanMap);
			
			return kikiHoshoPlanMap;
		}
		return null;
	}
	// ANK-3484-00-00 2018/09/26 ADD END
	
	/**
	 * オプションサービス(オプションサービス契約<ISP>一意照会)　呼び出し<br>
	 * <br>
	 * @param	eKK0351B002CBSMsg1ListElement	オプションサービス契約一覧照会（サービス契約番号）明細データ
	 * @param	handle							セッションハンドル
	 * @param	param							リクエストパラメータ
	 */
	private HashMap<String, String> callEKK0361A010(
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			SessionHandle handle, 
			IRequestParameterReadWrite param
	) throws RequestParameterException,SCException
	{
		CAANMsg template = new CAANMsg(EKK0361A010CBSMsg.class.getName());
		CAANMsg[] templates;

		HashMap<String, Object> eKK0361A010CBSMsg;
		CAANMsg[]               eKK0361A010CBSMsg1List;
		HashMap<String, String> eKK0361A010CBSMsg1ListElement;

		// nullマッピングを実施
		fillCAANMSGNullMapping(template, new EKK0361A010CBSMsg().getContents());

		// 共通部を設定
		editInMsgBasicCmn(param, template);

		// テンプレートID(SIFのID)
		template.set(EKK0361A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0361A010);

		// 機能コード
		template.set(EKK0361A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);

		// ＫＥＹ＿オプションサービス契約番号
		template.set(
				EKK0361A010CBSMsg.KEY_OP_SVC_KEI_NO,
				eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO)
		);

		// S-I/F実行
		templates = callCmn(handle, param, template);

		if (templates == null)
		{
			// エラーの場合は何もしない
			return null;
		}

		// 結果の受け取り
		eKK0361A010CBSMsg      = templates[0].getMsgData();
		eKK0361A010CBSMsg1List = (CAANMsg[])eKK0361A010CBSMsg.get(EKK0361A010CBSMsg.EKK0361A010CBSMSG1LIST);

		// レコードが見つからない場合は何もしない（データ不整合）
		if(eKK0361A010CBSMsg1List.length == 0)
		{
			return null;
		}

		eKK0361A010CBSMsg1ListElement = eKK0361A010CBSMsg1List[0].getMsgData();

		// 結果の返却
		return eKK0361A010CBSMsg1ListElement;

	}

	/******************************************************************************/
	/** 電話                                                                     **/
	/******************************************************************************/
	/**
	 * 電話系オプションサービス(オプションサービス契約<電話>一意照会)<br>
	 * <br>
	 * @param	eKK0351B002CBSMsg1ListElement	オプションサービス契約一覧照会（サービス契約番号）明細データ
	 * @param	handle							セッションハンドル
	 * @param	param							リクエストパラメータ
	 */
	private void callEKK0371A010Type(
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			SessionHandle handle, 
			IRequestParameterReadWrite param
	) throws RequestParameterException,SCException
	{
		HashMap<String, String> eKK0371A010Msg1ListElement;
		String opSvcCd;

		// オプションサービスコードの取得
		opSvcCd = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_CD);

		// オプションサービス契約<電話>一意照会の結果取得
		eKK0371A010Msg1ListElement = callEKK0371A010(eKK0351B002CBSMsg1ListElement, handle, param);

		// オプションサービスコードによる分岐
		if("B029".equals(opSvcCd))
		{
			// ０５０ナンバープラス　：　050オプション電話番号
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0371A010Msg1ListElement.get(EKK0371A010CBSMsg1List.N_050_OP_TELNO))
			);
		}
		else if("B072".equals(opSvcCd))
		{
			// 通話料上限通知　：　通話料上限金額
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0371A010Msg1ListElement.get(EKK0371A010CBSMsg1List.TWRYO_STIAM_TTU_TCHI_STIAM))
					+ "円"
			);
		}
		// ANK-3754-00-00 ADD START
		else if("B135".equals(opSvcCd))
		{
			// あんしん発着信サービス　：　トビラフォンID
			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					toDesc(eKK0371A010Msg1ListElement.get(EKK0371A010CBSMsg1List.TOBILAPH_ID))
			);
		}
		// ANK-3754-00-00 ADD END
	}

	/**
	 * オプションサービス契約<電話>一意照会<br>
	 * <br>
	 * @param	eKK0351B002CBSMsg1ListElement	オプションサービス契約一覧照会（サービス契約番号）明細データ
	 * @param	handle							セッションハンドル
	 * @param	param							リクエストパラメータ
	 */
	private HashMap<String, String> callEKK0371A010(
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			SessionHandle handle, 
			IRequestParameterReadWrite param
	) throws RequestParameterException,SCException
	{

		CAANMsg template = new CAANMsg(EKK0371A010CBSMsg.class.getName());
		CAANMsg[] templates;

		HashMap<String, Object> eKK0371A010CBSMsg;
		CAANMsg[]               eKK0371A010CBSMsg1List;
		HashMap<String, String> eKK0371A010CBSMsg1ListElement;

		// nullマッピングを実施
		fillCAANMSGNullMapping(template, new EKK0371A010CBSMsg().getContents());

		// 共通部を設定
		editInMsgBasicCmn(param, template);

		// テンプレートID(SIFのID)
		template.set(EKK0371A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0371A010);

		// 機能コード
		template.set(EKK0371A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);

		// ＫＥＹ＿オプションサービス契約番号
		template.set(
				EKK0371A010CBSMsg.KEY_OP_SVC_KEI_NO,
				eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO)
		);

		// S-I/F実行
		templates = callCmn(handle, param, template);

		if (templates == null)
		{
			// エラーの場合は何もしない
			return null;
		}

		// 結果の受け取り
		eKK0371A010CBSMsg      = templates[0].getMsgData();
		eKK0371A010CBSMsg1List = (CAANMsg[])eKK0371A010CBSMsg.get(EKK0371A010CBSMsg.EKK0371A010CBSMSG1LIST);

		// レコードが見つからない場合は何もしない（データ不整合）
		if(eKK0371A010CBSMsg1List.length == 0)
		{
			return null;
		}

		eKK0371A010CBSMsg1ListElement = eKK0371A010CBSMsg1List[0].getMsgData();

		// 結果の返却
		return eKK0371A010CBSMsg1ListElement;

	}

	/******************************************************************************/
	/** テレビ                                                                   **/
	/******************************************************************************/
	/**
	 * eo光テレビケーブルテレビガイド誌(オプションサービス契約<TV>一意照会)<br>
	 * <br>
	 * @param	eKK0351B002CBSMsg1ListElement	オプションサービス契約一覧照会（サービス契約番号）明細データ
	 * @param	handle							セッションハンドル
	 * @param	param							リクエストパラメータ
	 */
	private void callEKK0381A010Type(
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			SessionHandle handle, 
			IRequestParameterReadWrite param
	) throws RequestParameterException,SCException
	{

		HashMap<String, String> eKK0381A010Msg1ListElement;
		String opSvcCd;
		StringBuffer buffer = null;

		// オプションサービスコードの取得
		opSvcCd = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_CD);

		// オプションサービス契約<TV>一意照会の結果取得
		eKK0381A010Msg1ListElement = callEKK0381A010(eKK0351B002CBSMsg1ListElement, handle, param);

		// レコードが無い場合は何もしない（データ不整合）
		if(eKK0381A010Msg1ListElement == null)
		{
			return;
		}

		// オプションサービスコードによる分岐
		if("B068".equals(opSvcCd))
		{
			// eo光ケーブルテレビガイド文言の構築
			buffer = new StringBuffer();

			// ケーブルガイド申込数
			buffer.append(toDesc(eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.CABLE_GUIDE_MSKM_CNT)));

			// IT2-2012-0000643 2012-06-07 EDIT_START
			buffer.append("冊/");
			// IT2-2012-0000643 2012-06-07 EDIT_END

			// IT2-2012-0001815 2012/12/03 start
			// ガイド誌送付住所があればそれを表示　なければ利用場所住所を表示
			if(
					eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.GUIDEMG_SOHUS_STATE_NM) != null &&
					!"".equals(eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.GUIDEMG_SOHUS_STATE_NM))
			)
			{
				// ガイド誌送付先都道府県名
				buffer.append(toDesc(eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.GUIDEMG_SOHUS_STATE_NM)));
				// ガイド誌送付先市区町村名
				buffer.append(toDesc(eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.GUIDEMG_SOHUS_CITY_NM)));
				// ガイド誌送付先大字通称名
				buffer.append(toDesc(eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.GUIDEMG_SOHUS_OAZTSU_NM)));
				// ガイド誌送付先字丁目名
				buffer.append(toDesc(eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.GUIDEMG_SOHUS_AZCHO_NM)));
				// ガイド誌送付番地号
				buffer.append(toDesc(eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.GUIDEMG_SOHUS_BNCHIGO)));
				// ガイド誌送付住所補記・建物名
				buffer.append(toDesc(eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.GUIDEMG_SOHUS_ADRTTM)));
				// ガイド誌送付住所補記・部屋番号
				buffer.append(toDesc(eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.GUIDEMG_SOHUS_ADRRM)));
			}
			else
			{
				// サービス契約回線内訳一覧照会
				HashMap<String, String> eKK0241B001Msg1ListElement = callEKK0241B001(eKK0351B002CBSMsg1ListElement, handle, param);

				// 回線場所都道府県名
				buffer.append(toDesc(eKK0241B001Msg1ListElement.get(EKK0241B001CBSMsg1List.KAISEN_PLACE_STATE_NM)));
				// 回線場所市区町村名
				buffer.append(toDesc(eKK0241B001Msg1ListElement.get(EKK0241B001CBSMsg1List.KAISEN_PLACE_CITY_NM)));
				// 回線場所大字通称名
				buffer.append(toDesc(eKK0241B001Msg1ListElement.get(EKK0241B001CBSMsg1List.KAISEN_PLACE_OAZTSU_NM)));
				// 回線場所字丁目名
				buffer.append(toDesc(eKK0241B001Msg1ListElement.get(EKK0241B001CBSMsg1List.KAISEN_PLACE_AZCHO_NM)));
				// 回線場所番地号
				buffer.append(toDesc(eKK0241B001Msg1ListElement.get(EKK0241B001CBSMsg1List.KAISEN_PLACE_BNCHIGO)));
				// 回線場所住所補記・建物名
				buffer.append(toDesc(eKK0241B001Msg1ListElement.get(EKK0241B001CBSMsg1List.KAISEN_PLACE_ADRTTM)));
				// 回線場所住所補記・部屋番号
				buffer.append(toDesc(eKK0241B001Msg1ListElement.get(EKK0241B001CBSMsg1List.KAISEN_PLACE_ADRRM)));
			}
			// IT2-2012-0001815 2012/12/03 end

			eKK0351B002CBSMsg1ListElement.put(
					EKK0351B002CBSMsg1List.OP_SVC_NIY,
					buffer.toString()
			);
		}
		else if("B069".equals(opSvcCd))
		{
			ArrayList<HashMap<String, String>> cdDivList;
			HashMap<String, String> cdDivElement;

			// コード名称管理一覧照会（NHK団体一括支払サイクルコード--CD00675）
			cdDivList = callEZM0171B010("CD00675", handle, param);

			for(int i = 0 ; i < cdDivList.size() ; i ++)
			{
				// NHK団体一括支払サイクルコード
				String nhkGrpIktPayCycleCd = eKK0381A010Msg1ListElement.get(EKK0381A010CBSMsg1List.NHK_GRP_IKT_PAY_CYCLE_CD);

				// コード
				cdDivElement = (HashMap<String, String>)cdDivList.get(i);
				String cdDiv = cdDivElement.get(EZM0171B010CBSMsg1List.CD_DIV);

				if(nhkGrpIktPayCycleCd.equals(cdDiv))
				{
					// NHK団体一括支払サイクルコード名
					eKK0351B002CBSMsg1ListElement.put(
							EKK0351B002CBSMsg1List.OP_SVC_NIY,
							toDesc(cdDivElement.get(EZM0171B010CBSMsg1List.CD_DIV_NM))
					);

					break;
				}
			}
		}
	}

	/**
	 * コード名称管理一覧照会<br>
	 * <br>
	 * @param	cdSbtCd	コード種別
	 * @param	handle	セッションハンドル
	 * @param	param	リクエストパラメータ
	 * @return
	 */
	private ArrayList<HashMap<String, String>> callEZM0171B010(
			String cdSbtCd,
			SessionHandle handle, 
			IRequestParameterReadWrite param
	) throws RequestParameterException,SCException
	{
		CAANMsg template = new CAANMsg(EZM0171B010CBSMsg.class.getName());
		CAANMsg[] templates;

		HashMap<String, Object> eZM0171B010CBSMsg;
		CAANMsg[]               eZM0171B010CBSMsg1List;
		ArrayList<HashMap<String, String>> retArray;

		// nullマッピングを実施
		fillCAANMSGNullMapping(template, new EZM0171B010CBSMsg().getContents());

		// 共通部を設定
		editInMsgBasicCmn(param, template);

		// テンプレートID(SIFのID)
		template.set(EZM0171B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0171B010);

		// 機能コード
		template.set(EZM0171B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);

		// ＫＥＹ＿コード種別コード
		template.set(
				EZM0171B010CBSMsg.KEY_CD_SBT_CD,
				cdSbtCd
		);

		// S-I/F実行
		templates = callCmn(handle, param, template);

		if (templates == null)
		{
			// エラーの場合は何もしない
			return null;
		}

		// 結果の受け取り
		eZM0171B010CBSMsg      = templates[0].getMsgData();
		eZM0171B010CBSMsg1List = (CAANMsg[])eZM0171B010CBSMsg.get(EZM0171B010CBSMsg.EZM0171B010CBSMSG1LIST);

		// 結果の返却
		retArray = new ArrayList<HashMap<String, String>>();
		if(eZM0171B010CBSMsg1List == null)
		{
			return retArray;
		}

		for(int i = 0 ; i < eZM0171B010CBSMsg1List.length ; i ++)
		{
			retArray.add(eZM0171B010CBSMsg1List[i].getMsgData());
		}

		return retArray;

	}

	/**
	 * オプションサービス契約<TV>一意照会<br>
	 * <br>
	 * @param	eKK0351B002CBSMsg1ListElement	オプションサービス契約一覧照会（サービス契約番号）明細データ
	 * @param	handle							セッションハンドル
	 * @param	param							リクエストパラメータ
	 */
	private HashMap<String, String> callEKK0381A010(
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			SessionHandle handle, 
			IRequestParameterReadWrite param
	) throws RequestParameterException,SCException
	{

		CAANMsg template = new CAANMsg(EKK0381A010CBSMsg.class.getName());
		CAANMsg[] templates;

		HashMap<String, Object> eKK0381A010CBSMsg;
		CAANMsg[]               eKK0381A010CBSMsg1List;
		HashMap<String, String> eKK0381A010CBSMsg1ListElement;

		// nullマッピングを実施
		fillCAANMSGNullMapping(template, new EKK0381A010CBSMsg().getContents());

		// 共通部を設定
		editInMsgBasicCmn(param, template);

		// テンプレートID(SIFのID)
		template.set(EKK0381A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0381A010);

		// 機能コード
		template.set(EKK0381A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);

		// ＫＥＹ＿オプションサービス契約番号
		template.set(
				EKK0381A010CBSMsg.KEY_OP_SVC_KEI_NO,
				eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO)
		);

		// S-I/F実行
		templates = callCmn(handle, param, template);

		if (templates == null)
		{
			// エラーの場合は何もしない
			return null;
		}

		// 結果の受け取り
		eKK0381A010CBSMsg      = templates[0].getMsgData();
		eKK0381A010CBSMsg1List = (CAANMsg[])eKK0381A010CBSMsg.get(EKK0381A010CBSMsg.EKK0381A010CBSMSG1LIST);

		// レコードが見つからない場合は何もしない（データ不整合）
		if(eKK0381A010CBSMsg1List.length == 0)
		{
			return null;
		}

		eKK0381A010CBSMsg1ListElement = eKK0381A010CBSMsg1List[0].getMsgData();

		// 結果の返却
		return eKK0381A010CBSMsg1ListElement;

	}

	/**
	 * eo光テレビオプションチャンネル(オプションサービス一意照会)<br>
	 * <br>
	 * @param	eKK0351B002CBSMsg1ListElement	オプションサービス契約一覧照会（サービス契約番号）明細データ
	 * @param	handle							セッションハンドル
	 * @param	param							リクエストパラメータ
	 */
	private void callEKK0821A010Type(
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			SessionHandle handle, 
			IRequestParameterReadWrite param
	)
	{
		// オプションサービス名はもともとのレコードで保持しているので、それを拝借
		eKK0351B002CBSMsg1ListElement.put(
				EKK0351B002CBSMsg1List.OP_SVC_NIY,
				toDesc(eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_CD_NM))
		);
	}

	/******************************************************************************/
	/** サブ処理                                                                 **/
	/******************************************************************************/
	/**
	 * 業務パラメータ管理一意照会　呼び出し<br>
	 * <br>
	 * @param	handle	セッションハンドル
	 * @param	param	リクエストパラメータ
	 * @return			業務パラメータ管理一意照会結果
	 */
	private HashMap<String, String> callEZM0321A010(
			SessionHandle handle, 
			IRequestParameterReadWrite param
	) throws RequestParameterException,SCException
	{
		CAANMsg template = new CAANMsg(EZM0321A010CBSMsg.class.getName());
		CAANMsg[] templates;

		HashMap<String, Object> eZM0321A010CBSMsg;
		CAANMsg[]               eZM0321A010CBSMsg1List;
		HashMap<String, String> eZM0321A010CBSMsg1ListElement;

		// nullマッピングを実施
		fillCAANMSGNullMapping(template, new EZM0321A010CBSMsg().getContents());

		// 共通部を設定
		editInMsgBasicCmn(param, template);

		// テンプレートID(SIFのID)
		template.set(EZM0321A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0321A010);

		// 機能コード
		template.set(EZM0321A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿オプションサービス契約番号
		template.set(
				EZM0321A010CBSMsg.KEY_WORK_PARAM_ID,
				"KK_MLLIST_NM_DOMAIN"
		);

		// S-I/F実行
		templates = callCmn(handle, param, template);

		if (templates == null)
		{
			// エラーの場合は何もしない
			return null;
		}

		// 結果の受け取り
		eZM0321A010CBSMsg      = templates[0].getMsgData();
		eZM0321A010CBSMsg1List = (CAANMsg[])eZM0321A010CBSMsg.get(EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);

		// レコードが見つからない場合は何もしない（データ不整合）
		if(eZM0321A010CBSMsg1List.length == 0)
		{
			return null;
		}

		eZM0321A010CBSMsg1ListElement = eZM0321A010CBSMsg1List[0].getMsgData();

		// 結果の返却
		return eZM0321A010CBSMsg1ListElement;
	}

	/**
	 * 持ちうるフィールドにNullマッピングで埋める<br>
	 * <br>
	 * @param	msg			対象クラス
	 * @param	contents	対応クラスのフィールド列挙
	 */
	private void fillCAANMSGNullMapping(CAANMsg msg, Object[][] contents)
	{
		// 要素ごとのループ
		for(int i = 0 ; i < contents.length ; i++)
		{
			Object element = null;
			// キーに該当する箇所の取得
			element = contents[i][0];
			// Nullでマッピング
			msg.setNull((String)element);
		}
	}

	/**
	 * 条件部の共通する項目の設定する<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	template	template 条件の設定先
	 * @throws	RequestParameterException
	 */
	private void editInMsgBasicCmn(IRequestParameterReadOnly param, CAANMsg template)
	throws RequestParameterException
	{
		// オペレータ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);
	}

	/**
	 * サービスI/F実行用の上り情報を生成する<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	template	条件の設定先
	 * @return				S/I上り情報
	 * @throws	RequestParameterException
	 */
	private HashMap<String, Object> editInMsgCmn(IRequestParameterReadOnly param, CAANMsg template)
	throws RequestParameterException 
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * 引数のオブジェクトを表示文言に変換（Nullを空文字に変換）<br>
	 * <br>
	 * @param	target
	 * @return
	 */
	private String toDesc(Object target)
	{
		if(target == null)
		{
			return "";
		}

		return target.toString();

	}

	//20120425 add start
	//IT2-2012-0000314対応
	/**
	 * 異動予約一覧照会<br>
	 * <br>
	 * @param	eKK0351B002CBSMsg1ListElement	オプションサービス契約一覧照会（サービス契約番号）明細データ
	 * @param	handle							セッションハンドル
	 * @param	param							リクエストパラメータ
	 * @param	mlListDomain					メーリングリストドメイン
	 */
	private void callEKK1681B002Type(
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			SessionHandle handle, 
			IRequestParameterReadWrite param,
			// ▼▼▼▼▼ IT1-2018-0000191 MOD START ▼▼▼▼▼
//			String mlListDomain
			String mlListDomain,
			String fixedText
			// ▲▲▲▲▲ IT1-2018-0000191 MOD END ▲▲▲▲▲
	) throws RequestParameterException,SCException
	{
		String opSvcKeiNo;					// オプションサービス契約番号
		String sbOpSvcKeiNo;				// サブオプションサービス契約番号
		CAANMsg[] eKK1681B001CBSMsg1List;

// ▼▼▼▼▼ 削除 ▼▼▼▼▼
//		String val = (String)null;
// ▲▲▲▲▲ 削除 ▲▲▲▲▲
		String ido_rsv_flg = "0";   // IT1-2012-0001571 2012/11/12

		// オプションサービス契約番号の取得
		opSvcKeiNo = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO);

		// サブオプションサービス契約番号の取得
		sbOpSvcKeiNo = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.SBOP_SVC_KEI_NO);

		// 異動予約一覧照会の結果取得
		eKK1681B001CBSMsg1List = callEKK1681B001(
				opSvcKeiNo,
				sbOpSvcKeiNo,
				handle,
				param
		);

		if (eKK1681B001CBSMsg1List != null)
		{
			for (int i = 0;i < eKK1681B001CBSMsg1List.length;i++)
			{
				HashMap<String, Object> eKK1681B001CBSMsg1ListElement = eKK1681B001CBSMsg1List[i].getMsgData();

				// 異動予約が存在する かつ 移動予約状態コードが00(未反映)、01(反映済み)、03(予約手続き中)のいずれかの場合は予約適用年月日を設定
				if(
						eKK1681B001CBSMsg1ListElement != null
						&& (
								IDO_RSV_STAT_CD_00.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD)) ||
								IDO_RSV_STAT_CD_01.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD)) ||
								IDO_RSV_STAT_CD_03.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD))
						)
				)
				{
					// IT1-2012-0001571 2012/11/12 start
// ▼▼▼▼▼ 削除 ▼▼▼▼▼
//					if(
//							IDO_RSV_DTL_CD_016.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_DTL_CD)) ||
//							IDO_RSV_DTL_CD_018.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_DTL_CD))
//					)
//					{
//						// 利用終了予定日
//						val = (String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.RSV_APLY_YMD);
//					}
// ▲▲▲▲▲ 削除 ▲▲▲▲▲

					if(
							IDO_RSV_STAT_CD_00.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD)) ||
							IDO_RSV_STAT_CD_03.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD))
					)
					{
						// 異動予約がある
						ido_rsv_flg = "1";
					}
					// IT1-2012-0001571 2012/11/12 end
				} 
			}
		}
		// ▼▼▼▼▼ IT1-2018-0000191 ADD START ▼▼▼▼▼
		
		String opSvcCd = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_CD);
		
		// オプションコードが「B133:ＰＣプラン」の場合のみ、オプション契約一覧照会を行い、
		if (opSvcCd != null && opSvcCd.equals("B133")) {
			HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);
			// 端末補償操作CCのin項目
			// 機能コード
			dataMap.put("func_cd", "1");
			// 処理区分
			dataMap.put("shori_div", "1");
			
			// サービス契約番号
			String svcKeiNo = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.SVC_KEI_NO);
			
			dataMap.put("svc_kei_no", svcKeiNo);
			// v39.00.01 IT1-2018-0000191 ADD START
			// オプションサービス契約番号
			String opSvcKeiNo_IN = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO);
			
			dataMap.put("op_svc_kei_no", opSvcKeiNo_IN);
			// v39.00.01 IT1-2018-0000191 ADD END
			// サービス呼び出し
			JKKTmcpOperateCC jKKTmcpOperateCC = new JKKTmcpOperateCC();
			
			try
			{
				jKKTmcpOperateCC.main(handle, param, fixedText);
			}
			catch (Throwable e)
			{
				// 端末補償操作CCでエラーとなった場合、システムエラーにしないために処理を行わない。
				return;
			}
			
			// 端末補償操作CCの実行結果の取得処理
			if(dataMap.containsKey("info_list"))
			{
				// 照会リスト
				HashMap<String, List<HashMap<String, Object>>> infoListMap = new HashMap<String, List<HashMap<String, Object>>>();
				// ＰＣワイドプランリスト
				List<HashMap<String, Object>> pcWidePlanList = new ArrayList<HashMap<String, Object>>();

				if (eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO) != null)
				{
					opSvcKeiNo = eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO);
				}

				if (dataMap.get("info_list") != null)
				{
					// 照会リストの取得
					infoListMap = (HashMap<String, List<HashMap<String, Object>>>)dataMap.get("info_list");
					
					// ＰＣワイドプランリストの取得
					if (infoListMap.get("pc_wide_list") != null)
					{
						pcWidePlanList = infoListMap.get("pc_wide_list");
						if (pcWidePlanList.size() != 0)
						{
							// ＰＣワイドプランの取得
							for (int i = 0; i < pcWidePlanList.size(); i++)
							{
								String pcwPlan = (String) pcWidePlanList.get(i).get(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO);
								if (opSvcKeiNo.equals(pcwPlan))
								{
									sbOpSvcKeiNo = (String) pcWidePlanList.get(i).get(EKK0351B002CBSMsg1List.SBOP_SVC_KEI_NO);
								}
							}

						}
					}
				}
			}
			
			if( !sbOpSvcKeiNo.equals("") && sbOpSvcKeiNo != null )
			{
				// 異動予約一覧照会の結果取得
				eKK1681B001CBSMsg1List = callEKK1681B001(
						opSvcKeiNo,
						sbOpSvcKeiNo,
						handle,
						param
				);
	
				if (eKK1681B001CBSMsg1List != null)
				{
					for (int i = 0;i < eKK1681B001CBSMsg1List.length;i++)
					{
						HashMap<String, Object> eKK1681B001CBSMsg1ListElement = eKK1681B001CBSMsg1List[i].getMsgData();
	
						// 異動予約が存在する かつ 移動予約状態コードが00(未反映)、01(反映済み)、03(予約手続き中)のいずれかの場合は予約適用年月日を設定
						if(
								eKK1681B001CBSMsg1ListElement != null
								&& (
										IDO_RSV_STAT_CD_00.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD)) ||
										IDO_RSV_STAT_CD_01.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD)) ||
										IDO_RSV_STAT_CD_03.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD))
								)
						)
						{
							if(
									IDO_RSV_STAT_CD_00.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD)) ||
									IDO_RSV_STAT_CD_03.equals((String)eKK1681B001CBSMsg1ListElement.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD))
							)
							{
								// 異動予約がある
								ido_rsv_flg = "1";
							}
						} 
					}
				}
			}
		}
		// ▲▲▲▲▲ IT1-2018-0000191 ADD END ▲▲▲▲▲

// ▼▼▼▼▼ 削除 ▼▼▼▼▼
//		eKK0351B002CBSMsg1ListElement.put(OPSVC_END_RSV_YMD, val);
// ▲▲▲▲▲ 削除 ▲▲▲▲▲
		eKK0351B002CBSMsg1ListElement.put(IDO_RSV_FLG, ido_rsv_flg);  // IT1-2012-0001571 2012/11/12
	}

	//20120424
	/**
	 * 異動予約一覧照会　呼び出し<br>
	 * <br>
	 * @param	opSvcKeiNo		オプションサービス契約番号
	 * @param	sbOpSveKeiNo	サブオプションサービス契約番号
	 * @param	handle			セッションハンドル
	 * @param	param			リクエストパラメータ
	 */
	private CAANMsg[] callEKK1681B001(
			String opSvcKeiNo,
			String sbOpSveKeiNo,
			SessionHandle handle, 
			IRequestParameterReadWrite param
	) throws RequestParameterException,SCException
	{
		CAANMsg template = new CAANMsg(EKK1681B001CBSMsg.class.getName());
		CAANMsg[] templates;

		HashMap<String, Object> eKK1681B001CBSMsg;
		CAANMsg[]               eKK1681B001CBSMsg1List;

		// nullマッピングを実施
		fillCAANMSGNullMapping(template, new EKK1681B001CBSMsg().getContents());

		// 共通部を設定
		editInMsgBasicCmn(param, template);

		// テンプレートID(SIFのID)
		template.set(EKK1681B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681B001);

		// 機能コード
		template.set(EKK1681B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// サブオプション契約番号が設定されている場合はサブオプションサービス契約番号で検索
		if ("".equals(sbOpSveKeiNo))
		{
			// ＫＥＹ＿オプションサービス契約番号
			template.set(
					EKK1681B001CBSMsg.KEY_OP_SVC_KEI_NO,
					opSvcKeiNo
			);
		}
		else
		{
			// ＫＥＹ＿サブオプションサービス契約番号
			template.set(
					EKK1681B001CBSMsg.KEY_SBOP_SVC_KEI_NO,
					sbOpSveKeiNo
			);
		}

		// S-I/F実行
		templates = callCmn(handle, param, template);

		if (templates == null)
		{
			// エラーの場合は何もしない
			return null;
		}

		// 結果の受け取り
		eKK1681B001CBSMsg      = templates[0].getMsgData();
		eKK1681B001CBSMsg1List = (CAANMsg[])eKK1681B001CBSMsg.get(EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);

		//レコードが見つからない場合は何もしない（データ不整合）
		if(eKK1681B001CBSMsg1List.length == 0)
		{
			return null;
		}

		// 結果の返却
		return eKK1681B001CBSMsg1List;
	}

	// IT2-2012-0001815 2012/12/03 start
	/**
	 * オプションサービス契約<TV>一意照会
	 * @param	eKK0351B002CBSMsg1ListElement	オプションサービス契約一覧照会（サービス契約番号）明細データ
	 * @param	handle							セッションハンドル
	 * @param	param							リクエストパラメータ
	 * @return									
	 * @throws RequestParameterException
	 * @throws SCException
	 */
	private HashMap<String, String> callEKK0241B001(
			HashMap<String, String> eKK0351B002CBSMsg1ListElement,
			SessionHandle handle, 
			IRequestParameterReadWrite param
	) throws RequestParameterException,SCException
	{
		CAANMsg template = new CAANMsg(EKK0241B001CBSMsg.class.getName());
		CAANMsg[] templates;

		HashMap<String, Object> eKK0241B001CBSMsg;
		CAANMsg[]               eKK0241B001CBSMsg1List;
		HashMap<String, String> eKK0241B001CBSMsg1ListElement;

		// nullマッピングを実施
		fillCAANMSGNullMapping(template, new EKK0241B001CBSMsg().getContents());

		// 共通部を設定
		editInMsgBasicCmn(param, template);

		// テンプレートID(SIFのID)
		template.set(EKK0241B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0241B001);

		// 機能コード
		template.set(EKK0241B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿オプションサービス契約番号
		template.set(
				EKK0241B001CBSMsg.KEY_SVC_KEI_NO,
				eKK0351B002CBSMsg1ListElement.get(EKK0351B002CBSMsg1List.SVC_KEI_NO)
		);

		// S-I/F実行
		templates = callCmn(handle, param, template);

		if (templates == null)
		{
			// エラーの場合は何もしない
			return null;
		}

		// 結果の受け取り
		eKK0241B001CBSMsg      = templates[0].getMsgData();
		eKK0241B001CBSMsg1List = (CAANMsg[])eKK0241B001CBSMsg.get(EKK0241B001CBSMsg.EKK0241B001CBSMSG1LIST);

		// レコードが見つからない場合は何もしない（データ不整合）
		if(eKK0241B001CBSMsg1List.length == 0)
		{
			return null;
		}

		eKK0241B001CBSMsg1ListElement = eKK0241B001CBSMsg1List[0].getMsgData();

		// 結果の返却
		return eKK0241B001CBSMsg1ListElement;

	}
	// IT2-2012-0001815 2012/12/03 end
}

/**
 * @author 909881
 */
class KKSV0043Comparator implements Comparator<Map<String, String>>
{

	/** 昇順フラグ */
	private boolean isAsc = true;

	/** サブ昇順フラグ */
	private boolean isSubAsc = true;

	/** ソートの基準となるキー */
	private String sortKey = "";

	/** ソートの基準となるサブキー */
	private String sortSubKey = "";

	/**
	 * 順序付けのために 2 つの引数を比較します。最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2
	 * 番目の引数より大きい場合は正の整数を返します。<br />
	 * 
	 * @param o1
	 *            - 比較対象の最初のオブジェクト
	 * @param o2
	 *            - 比較対象の 2 番目のオブジェクト
	 * @return int 最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2
	 *         番目の引数より大きい場合は正の整数
	 */
	@Override
	public int compare(Map<String, String> o1, Map<String, String> o2)
	{
		if (o1.get(this.getSortKey()).compareTo(o2.get(this.getSortKey())) == 0)
		{
			if (this.getSortSubKey() == null || "".equals(this.getSortSubKey()))
			{
				return 0;
			}

			else
			{
				if (o1.get(this.getSortSubKey()).compareTo(o2.get(this.getSortSubKey())) == 0)
				{
					return 0;
				}
				else if (o1.get(this.getSortSubKey()).compareTo(o2.get(this.getSortSubKey())) > 0)
				{
					return isSubAsc ? 1 : -1;
				}

				else if (o1.get(this.getSortSubKey()).compareTo(o2.get(this.getSortSubKey())) < 0)
				{
					return isSubAsc ? -1 : 1;
				}
			}

		}
		else if (o1.get(this.getSortKey()).compareTo(o2.get(this.getSortKey())) > 0)
		{
			return isAsc ? 1 : -1;
		}

		else if (o1.get(this.getSortKey()).compareTo(o2.get(this.getSortKey())) < 0)
		{
			return isAsc ? -1 : 1;
		}

		return 0;
	}

	/**
	 * ソートキーを取得します。
	 * @return ソートキー
	 */
	public String getSortKey()
	{
		return sortKey;
	}

	/**
	 * サブソートキーを取得します。
	 * @return サブソートキー
	 */
	public String getSortSubKey()
	{
		return sortSubKey;
	}

	/**
	 * ソートキーを設定します。
	 * @param key ソートキー
	 */
	public void setSortKey(String key)
	{
		if (key.indexOf("_desc") > 0)
		{
			this.isAsc = false;
		}

		this.sortKey = key.replaceAll("_desc", "").replaceAll("_asc", "");
	}

	/**
	 * サブソートキーを設定します。
	 * @param key サブソートキー
	 */
	public void setSortSubKey(String key)
	{
		if (key.indexOf("_desc") > 0)
		{
			this.isSubAsc = false;
		}

		this.sortSubKey = key.replaceAll("_desc", "").replaceAll("_asc", "");
	}
}
