/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUHTPlanChgPrcShokaiCC
*   ソースファイル名：JFUHTPlanChgPrcShokaiCC.java
*   作成者          ：富士通
*   日付            ：2012年04月03日
*＜機能概要＞
*   eo光ネットホームタイププラン変更基本料金一覧照会コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/04/03   FJ）岡井    新規作成
*   v4.00       2012/11/28   FJ）岡井    【IT1-2012-0002214】長割解約精算金対応
*   v4.00       2013/01/07   FJ）岡井    【ST4-2012-0000250】性能障害対応
*   v5.00       2013/04/05   FJ) 瀧澤    551 お引越し手続き申込画面用の処理を新規追加
*   v5.10       2013/04/26   FJ) 岡井    機能コード変更
*   v8.00       2014/04/08   FJ）中谷    【OM-2014-0001465】100Mライト上限額表示不具合対応(暫定対応)
*   v8.00       2014/04/08   FJ）中谷    【OM-2014-0001465】100Mライト上限額表示不具合対応(本格対応)
*   v63.00      2022/12/16   FJ）美濃原  【ANK-4334-00-00】100Mライト見直し対応
*   v68.00      2023/11/30   FJ) 張本    【ANK-4479-00-00】【eo】フロント料金シミュレーション機能の性能改善
*   v73.00      2024/11/15   FJ) 張本    【ANK-4493-00-00】【eo定期】光配線マンションのコースアップ対応
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JACPrcSimulationMsg;
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.common.JCMConstants;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0591B501CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0591B501CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0611A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0611A010CBSMsg1List;

/**
 * eo光ネットホームタイププラン変更基本料金一覧照会コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUHTPlanChgPrcShokaiCC extends JFUBaseCC
{
	// ■料金グループコード別料金プラン一覧照会（フロント）
	/** テンプレートID 料金グループコード別料金プラン一覧照会（フロント） */
	private static final String TEMPLATE_ID_EKK0591B501 = "EKK0591B501";
	/** テンプレートID(明細) 料金グループコード別料金プラン一覧照会（フロント） */
	private static final String TEMPLATE_ID_DTL_EKK0591B501 = EKK0591B501CBSMsg.EKK0591B501CBSMSG1LIST;
	/** IN項目リスト 料金グループコード別料金プラン一覧照会（フロント） */
	private static final List<String> IN_COLUMN_LIST_EKK0591B501 =
			Arrays.asList(EKK0591B501CBSMsg.KEY_PRC_GRP_CD, EKK0591B501CBSMsg.KEY_PCRS_CD, EKK0591B501CBSMsg.KEY_PPLAN_CD);
	/** 関連チェックエラー項目 料金グループコード別料金プラン一覧照会（フロント） */
	private static final String ERROR_COLUMN_EKK0591B501 = EKK0591B501CBSMsg.KEY_PCRS_CD_ERR;

	// ■料金シミュレーション
// ANK-3636-00-00 MOD START
	// 料金項目コードリスト ※料金シミュレーション用の科目を変更する場合は、100Mライト科目(1),100Mライト科目(2)の修正を行う。
	/** 料金項目コードリスト(通常割1年目、通常割2年目、通常割3年目、即割、長割3年目〜、長割6年目〜) */
	private static final List<String> KIHON_PRC_KMK_CD_LIST =
			Arrays.asList("S1200100101", "S1200100201", "S1200100301", "S1200200101", "S1200300101", "S1200300201");

	/** 料金項目コードリスト 100Mライト科目(1)   (通常割1年目、通常割2年目、通常割3年目、即割、長割3年目〜、長割6年目〜) */
	private static final List<String> KIHON_PRC_KMK_CD_100ML_LIST =
			Arrays.asList("S1200101101", "S1200101201", "S1200101301", "S1200201101", "S1200301101", "S1200301201");

	/** 呼出元に返却する料金科目コードMAP 100Mライト科目(2)   左：料金シミュレーション検索用、右：返却用 */
	private static final Map<String, String> RESULT_KIHON_PRC_KMK_MAP = new HashMap<String, String>()
	{
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		{
			put("S1200101101", "S1200100101"); // 通常割1年目
			put("S1200101201", "S1200100201"); // 通常割2年目
			put("S1200101301", "S1200100301"); // 通常割3年目
			put("S1200201101", "S1200200101"); // 即割
			put("S1200301101", "S1200300101"); // 長割3年目〜
			put("S1200301201", "S1200300201"); // 長割6年目〜
		}
	};

	/** 料金項目コードリスト(解約精算金0ヶ月、解約精算金12ヶ月、解約精算金24ヶ月、長解約精算金36ヶ月) */
	private static final List<String> DSL_PRC_KMK_CD_LIST = Arrays.asList("S1202000001", "S1202001201", "S1202002401", "S1202003601");
// ANK-3636-00-00 MOD END

	// ■料金プラン従量単価一意照会
	/** テンプレートID 料金プラン従量単価一意照会 */
	private static final String TEMPLATE_ID_EKK0611A010 = "EKK0611A010";
	/** テンプレートID(明細) 料金プラン従量単価一意照会 */
	private static final String TEMPLATE_ID_DTL_EKK0611A010 = EKK0611A010CBSMsg.EKK0611A010CBSMSG1LIST;
	/** IN項目リスト 料金プラン従量単価一意照会 */
	private static final List<String> IN_COLUMN_LIST_EKK0611A010 =
			Arrays.asList(EKK0611A010CBSMsg.KEY_PCRS_CD, EKK0611A010CBSMsg.KEY_PPLAN_CD, EKK0611A010CBSMsg.KEY_PPLAN_TANKA_SBT_CD,
					EKK0611A010CBSMsg.KEY_KEI_STAT_SBT_CD, EKK0611A010CBSMsg.KEY_GENE_ADD_DTM, EKK0611A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目 料金プラン従量単価一意照会 */
	private static final String ERROR_COLUMN_EKK0611A010 = EKK0611A010CBSMsg.KEY_PCRS_CD_ERR;

	// ■結果返却
	/** 基本料金リスト(返却リスト) */
	private static final String RESULT_LIST_NM = "JFUHTPlanChgPrcShokaiCCMsg1List";

	// ■項目ID
	/** ＫＥＹ＿料金グループコード */
	private static final String KEY_PRC_GRP_CD = "key_prc_grp_cd";
	/** ＫＥＹ＿料金コースコード */
	private static final String KEY_PCRS_CD = "key_pcrs_cd";
	/** スペース12桁 */
	private static final String SPACE_12KETA = "            ";
	/** ＫＥＹ＿料金プランコード */
	private static final String KEY_PRC_PLAN_CD = "key_prc_plan_cd";
	/** ＫＥＹ＿料金項目コード */
	private static final String KEY_PRC_KMK_CD = "key_prc_kmk_cd";
	/** eo光ネット料金プラン全検索フラグ */
	private static final String ALL_SEARCH_FLG = "all_search_flg";
	/** 解約精算金取得フラグ */
	private static final String DLS_PRC_GET_FLG = "dls_prc_get_flg";
	/** 機能サービスコード */
	private static final String FUNC_SVC_ID = "func_svc_id";
	/** 機能コード */
	private static final String FUNC_CODE = "func_code";
	/** 料金シミュレーション基本料金リスト */
	private static final String JACPRCSIMULATIONLIST = "JACPrcSimulationList";
	/** 料金シミュレーション解約精算金リスト */
	private static final String JACPRCSIMULATIONDSLPRCLIST = "JACPrcSimulationDslPrcList";
	/** 料金プラン従量単価一意照会リスト */
	private static final String EKK0611A010LIST = "EKK0611A010List";
	/** OUTPUTマップキー 料金コース */
	private static final String OUT_MAP_KEY_PCRS_CD = "pcrs_cd";
	/** OUTPUTマップキー 料金コース */
	private static final String OUT_MAP_KEY_PPLAN_CD = "pplan_cd";
	/** OUTPUTマップキー 料金項目コード */
	private static final String OUT_MAP_KEY_PRC_KMK_CD = "prc_kmk_cd";

	// ■汎用コード
	/** 汎用コード：0 */
	private static final String CODE_0 = "0";
	/** 汎用コード：1 */
	private static final String CODE_1 = "1";
	/** FUSV0237 */
	private static final String FUSV0237 = "FUSV0237";
	/** 料金項目コード：上限額 */
// ANK-3636-00-00 MOD START
	private static final String PRC_KMK_CD_JOGEN = "S1201101601";
// ANK-3636-00-00 MOD END

	/**
	 * 基本料金取得処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception
	 */
	public IRequestParameterReadWrite getResultData(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{

		debugLog("■■■getResultData ■■■基本料金取得処理開始 [getResultData]");

		// 結果返却マップ
		HashMap resultMap = new HashMap();
		// 結果返却リスト
		ArrayList outList = new ArrayList();

		// eo光ネット料金プラン全検索フラグ取得
		String allSearchFlg = getAllSearchFlg(param, fixedText);
		// 解約精算金取得フラグ取得
		String dlsPrcGetFlg = getDslGetFlg(param, fixedText);

		// IN項目：料金グループコード
		String inPrcGrpCd = (String)((HashMap)param.getData(fixedText)).get(KEY_PRC_GRP_CD);
		// IN項目：料金コースコード
		String inPcrsCd = (String)((HashMap)param.getData(fixedText)).get(KEY_PCRS_CD);
		// IN項目：料金プランコード
		String inPplanCd = (String)((HashMap)param.getData(fixedText)).get(KEY_PRC_PLAN_CD);
		// IN項目：機能サービスコード
		String inFuncSvcCd = (String)((HashMap)param.getData(fixedText)).get(FUNC_SVC_ID);

		// マンションの場合は処理を中断する
		if (JFUStrConst.CD00133_04.equals(inPrcGrpCd))
		{
			return param;
		}

		ArrayList<HashMap> resEKK0591B501List = new ArrayList<HashMap>();

		JACPrcSimulation prcSimu = null;

		// 機能サービスコードで実行するか判定する
		if (!JFUBPCommon.isNull(inFuncSvcCd) && FUSV0237.equals(inFuncSvcCd))
		{
			HashMap<String, String> dslPrcInfoMap = new HashMap<String, String>();

			dslPrcInfoMap.put(EKK0591B501CBSMsg1List.PCRS_CD, inPcrsCd);
			dslPrcInfoMap.put(EKK0591B501CBSMsg1List.PPLAN_CD, inPplanCd);

			resEKK0591B501List.add(dslPrcInfoMap);
		}
		else
		{
			// ●料金グループコード別料金プラン一覧照会（フロント）
			executeEKK0591B501(handle, param, fixedText);
			// 料金グループコード別料金プラン一覧照会（フロント）の明細リスト取得
			resEKK0591B501List = getDTLList((HashMap)param.getData(fixedText), TEMPLATE_ID_DTL_EKK0591B501);
			// プラン変更あり
			prcSimu = new JACPrcSimulation();
		}

		// 結果が存在する場合のみ実行
		if (resEKK0591B501List != null && resEKK0591B501List.size() > 0)
		{
			// 料金グループコード別料金プラン一覧照会（フロント）の結果件数分ループ
			for (HashMap pcrsMap : resEKK0591B501List)
			{
				HashMap outMap = new HashMap();

				// 料金コースコード取得
				String pcrsCd = (String)pcrsMap.get(EKK0591B501CBSMsg1List.PCRS_CD);
				// 料金プランコード取得
				String pplanCd = (String)pcrsMap.get(EKK0591B501CBSMsg1List.PPLAN_CD);

				if (CODE_0.equals(allSearchFlg) && !pcrsCd.equals(inPcrsCd) && !pplanCd.equals(inPplanCd))
				{
					// 全検索しない、料金コースコードが異なる、料金プランコードが異なる場合、次の処理へ移行する
					continue;
				}

				outMap.put(EKK0591B501CBSMsg1List.PCRS_CD, (String)pcrsMap.get(EKK0591B501CBSMsg1List.PCRS_CD));
				outMap.put(EKK0591B501CBSMsg1List.PPLAN_CD, (String)pcrsMap.get(EKK0591B501CBSMsg1List.PPLAN_CD));
				outMap.put(EKK0591B501CBSMsg1List.PCRS_NM, (String)pcrsMap.get(EKK0591B501CBSMsg1List.PCRS_NM));
				outMap.put(EKK0591B501CBSMsg1List.PPLAN_NM, (String)pcrsMap.get(EKK0591B501CBSMsg1List.PPLAN_NM));

				// 料金シミュレーション(AC)部品に料金項目を設定する
				if (prcSimu != null)
				{
					setJACPrcSimulation(handle, param, fixedText, pcrsCd, pplanCd, prcSimu);
				}

				// ●料金シミュレーション(基本料金)
				ArrayList kihonPrcList = executeJACPrcSimulation(handle, param, fixedText, pcrsCd, pplanCd, getKihonPrcKmkCdList(pcrsCd, pplanCd), prcSimu);

				// 従量制(100Mライト)が対象の場合は以下を実行
				if (JFUStrConst.CD00134_A03.equals(pcrsCd) && JFUStrConst.CD00565_PA0311.equals(pplanCd)
						|| (JFUStrConst.CD00134_A08.equals(pcrsCd) && JFUStrConst.CD00565_PA0811.equals(pplanCd)))
				{
					// ●料金プラン従量単価一意照会
					HashMap resMap = executeEKK0611A010(handle, param, fixedText, pcrsCd, pplanCd);
					// 料金プラン従量単価一意照会結果を格納
					outMap.put(EKK0611A010LIST, resMap);

					// 料金プランコード⇔料金サービスコード変換(HT100Mライト)
					pplanCd = pplanCd.replace(JFUStrConst.CD00565_PA0311, JFUStrConst.CH0391_PRC_SVC_CD_SA0311);
					// 料金プランコード⇔料金サービスコード変換(MZ100Mライト)
					pplanCd = pplanCd.replace(JFUStrConst.CD00565_PA0811, JFUStrConst.CH0391_PRC_SVC_CD_SA0811);

					// ●料金シミュレーション(基本料金) ※上限額取得
					ArrayList kihonPrcListLite = executeJACPrcSimulation(handle, param, fixedText, pcrsCd, pplanCd, getKihonPrcKmkCdList(pcrsCd, pplanCd), prcSimu);

					for (Object obj : kihonPrcListLite)
					{
						HashMap map = (HashMap)obj;

						ArrayList list = (ArrayList)map.get(JACPrcSimulationMsg.JACPrcSimulationMSG2LIST);

						for (Object child : list)
						{
							HashMap childMap = (HashMap)child;

							if (PRC_KMK_CD_JOGEN.equals(childMap.get(OUT_MAP_KEY_PRC_KMK_CD)))
							{
								HashMap jogenMap = new HashMap();
								ArrayList jogenList = new ArrayList();

								jogenList.add(childMap);
								jogenMap.put(JACPrcSimulationMsg.JACPrcSimulationMSG2LIST, jogenList);
								kihonPrcList.add(jogenMap);
								break;
							}
						}
					}
				}

				// 料金シミュレーション結果を格納
				outMap.put(JACPRCSIMULATIONLIST, kihonPrcList);

				// ●料金シミュレーション(解約精算金)
				if (CODE_1.equals(dlsPrcGetFlg))
				{
					// 取得フラグが「1」の場合、解約精算金を取得する。
					ArrayList dslPcrList = executeJACPrcSimulation(handle, param, fixedText, pcrsCd, pplanCd, DSL_PRC_KMK_CD_LIST);
					// 料金シミュレーション結果(解約精算金)を格納
					outMap.put(JACPRCSIMULATIONDSLPRCLIST, dslPcrList);
				}

				// 1ループ毎に結果を格納
				outList.add(outMap);
			}

			// 最終結果をユーザデータに格納
			resultMap.put(RESULT_LIST_NM, outList);
			param.setData(fixedText, resultMap);
		}

		debugLog("■■■getResultData ■■■基本料金取得処理終了 [getResultData]");

		return param;
	}

	/**
	 * 基本料金取得処理です。
	 * 引数の料金コース、料金プランコードに該当する基本料金を取得します。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception
	 */
	public IRequestParameterReadWrite getBasicPrcData(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		debugLog("■■■getBasicPrcData ■■■基本料金取得処理開始 [getBasicPrcData]");

		// 結果返却マップ
		HashMap resultMap = new HashMap();
		// 結果返却リスト
		ArrayList outList = new ArrayList();

		// IN項目：料金コースコード
		String inPcrsCd = (String)((HashMap)param.getData(fixedText)).get(KEY_PCRS_CD);
		// IN項目：料金プランコード
		String inPplanCd = (String)((HashMap)param.getData(fixedText)).get(KEY_PRC_PLAN_CD);

		// 料金グループコード別料金プラン一覧照会（フロント）の結果件数分ループ

		HashMap outMap = new HashMap();

		outMap.put(OUT_MAP_KEY_PCRS_CD, inPcrsCd);
		outMap.put(OUT_MAP_KEY_PPLAN_CD, inPplanCd);

		// ●料金シミュレーション(基本料金)
		ArrayList kihonPrcList = executeJACPrcSimulation(handle, param, fixedText, inPcrsCd, inPplanCd, getKihonPrcKmkCdList(inPcrsCd, inPplanCd));

		// 従量制(100Mライト)が対象の場合は以下を実行
		if (JFUStrConst.CD00134_A03.equals(inPcrsCd) && JFUStrConst.CD00565_PA0311.equals(inPplanCd)
				|| (JFUStrConst.CD00134_A08.equals(inPcrsCd) && JFUStrConst.CD00565_PA0811.equals(inPplanCd)))
		{
			// 料金プランコード⇔料金サービスコード変換(HT100Mライト)
			inPplanCd = inPplanCd.replace(JFUStrConst.CD00565_PA0311, JFUStrConst.CH0391_PRC_SVC_CD_SA0311);
			// 料金プランコード⇔料金サービスコード変換(MZ100Mライト)
			inPplanCd = inPplanCd.replace(JFUStrConst.CD00565_PA0811, JFUStrConst.CH0391_PRC_SVC_CD_SA0811);

			// ●料金シミュレーション(基本料金) ※上限額取得
			ArrayList kihonPrcListLite = executeJACPrcSimulation(handle, param, fixedText, inPcrsCd, inPplanCd, getKihonPrcKmkCdList(inPcrsCd, inPplanCd));

			for (Object obj : kihonPrcListLite)
			{
				HashMap map = (HashMap)obj;

				ArrayList list = (ArrayList)map.get(JACPrcSimulationMsg.JACPrcSimulationMSG2LIST);

				for (Object child : list)
				{
					HashMap childMap = (HashMap)child;

					if (PRC_KMK_CD_JOGEN.equals(childMap.get(OUT_MAP_KEY_PRC_KMK_CD)))
					{
						HashMap jogenMap = new HashMap();
						ArrayList jogenList = new ArrayList();

						jogenList.add(childMap);
						jogenMap.put(JACPrcSimulationMsg.JACPrcSimulationMSG2LIST, jogenList);
						kihonPrcList.add(jogenMap);
						break;
					}
				}
			}
		}

		// 料金シミュレーション結果を格納
		outMap.put(JACPRCSIMULATIONLIST, kihonPrcList);

		// 結果を格納
		outList.add(outMap);

		// 最終結果をユーザデータに格納
		resultMap.put(RESULT_LIST_NM, outList);
		param.setData(fixedText, resultMap);

		debugLog("■■■getBasicPrcData ■■■基本料金取得処理終了 [getBasicPrcData]");

		return param;
	}

	/**
	 * チェック処理です。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return チェック処理用マップ
	 * @throws Exception 
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * 料金グループコード別料金プラン一覧照会（フロント）のサービスIF実行処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws Exception 
	 */
	private void executeEKK0591B501(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 上りマッピング
		setEKK0591B501(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0591B501, TEMPLATE_ID_DTL_EKK0591B501, IN_COLUMN_LIST_EKK0591B501,
				ERROR_COLUMN_EKK0591B501);
	}

	/**
	 * 解約精算金取得フラグを取得します。
	 * 
	 * <br>
	 * @param param 1リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return 解約精算金取得フラグ
	 * @throws Exception
	 */
	private String getDslGetFlg(IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 結果格納
		String result = JFUStrConst.EMPTY;

		// リクエストパラメータデータ取得
		HashMap<?, ?> paramMap = (HashMap<?, ?>)param.getData(fixedText);

		// 設定されている場合、値を取得する
		if (paramMap.containsKey(DLS_PRC_GET_FLG) && paramMap.get(DLS_PRC_GET_FLG) != null && ((String)paramMap.get(DLS_PRC_GET_FLG)).length() > 0)
		{
			result = (String)paramMap.get(DLS_PRC_GET_FLG);
		}

		return result;
	}

	/**
	 * eo光ネット料金プラン全検索フラグを取得します。
	 * 
	 * <br>
	 * @param param 1リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return eo光ネット料金プラン全検索フラグ
	 * @throws Exception
	 */
	private String getAllSearchFlg(IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 結果格納
		String result = JFUStrConst.EMPTY;

		// リクエストパラメータデータ取得
		HashMap<?, ?> paramMap = (HashMap<?, ?>)param.getData(fixedText);

		// 設定されている場合、値を取得する
		if (paramMap.containsKey(ALL_SEARCH_FLG) && paramMap.get(ALL_SEARCH_FLG) != null && ((String)paramMap.get(ALL_SEARCH_FLG)).length() > 0)
		{
			result = (String)paramMap.get(ALL_SEARCH_FLG);
		}

		return result;
	}

	/**
	 * 料金シミュレーション(AC)部品実行処理です。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @param pcrKmkCdListNm 料金コードリスト
	 * @return 結果リスト
	 * @throws Exception
	 */
	private ArrayList executeJACPrcSimulation(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String pcrsCd,
			String pplanCd, List<String> pcrKmkCdListNm) throws Exception
	{
		// 返却結果リスト
		ArrayList prcSimuList = new ArrayList();

		for (String prcKmkCd : pcrKmkCdListNm)
		{
			// 上りマッピング
			setPrcSimParam(param, fixedText, pcrsCd, pplanCd, prcKmkCd);
			// 部品呼出
			JACPrcSimulation prcSimu = new JACPrcSimulation();
			prcSimu.getPrcSimulation(handle, param, fixedText);
			// 結果リスト取得
			prcSimuList.add(getJACPrcSimulation((HashMap)param.getData(fixedText)));
		}

		return prcSimuList;
	}

	/**
	 * 料金シミュレーション(AC)部品実行処理です。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @param pcrKmkCdListNm 料金コードリスト
	 * @param cc 料金シミュレーション部品
	 * @return 結果リスト
	 * @throws Exception
	 */
	private ArrayList executeJACPrcSimulation(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String pcrsCd,
			String pplanCd, List<String> pcrKmkCdListNm, JACPrcSimulation prcSimu) throws Exception
	{

		if(prcSimu == null)
		{
			return executeJACPrcSimulation(handle, param, fixedText, pcrsCd, pplanCd, pcrKmkCdListNm);
		}

		// 返却結果リスト
		ArrayList prcSimuList = new ArrayList();

		for (String prcKmkCd : pcrKmkCdListNm)
		{
			// 上りマッピング
			setPrcSimParam(param, fixedText, pcrsCd, pplanCd, prcKmkCd);
			// 部品呼出
			prcSimu.getPrcSimulation(handle, param, fixedText);
			// 結果リスト取得
			prcSimuList.add(getJACPrcSimulation((HashMap)param.getData(fixedText)));
		}

		return prcSimuList;
	}

	/**
	 * 料金プラン従量単価一意照会のサービスIF実行処理です。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @return 結果マップ
	 * @throws Exception
	 */
	private HashMap executeEKK0611A010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String pcrsCd, String pplanCd)
			throws Exception
	{
		// 上りマッピング
		setEKK0611A010(param, fixedText, pcrsCd, pplanCd);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0611A010, TEMPLATE_ID_DTL_EKK0611A010, IN_COLUMN_LIST_EKK0611A010,
				ERROR_COLUMN_EKK0611A010);
		// 下りマッピング
		HashMap outMap = getEKK0611A010((HashMap)param.getData(fixedText));

		return outMap;
	}

	/**
	 * 料金グループコード別料金プラン一覧照会（フロント）の上りマッピング処理です。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws RequestParameterException
	 */
	private void setEKK0591B501(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap usrData = (HashMap)param.getData(fixedText);

		if (usrData != null && usrData.size() > 0)
		{
			// 機能コード取得
			String funcCd = (String)usrData.get(FUNC_CODE);

			// 機能コード設定
			setFuncCode(param, fixedText, funcCd);
		}
	}

	/**
	 * 料金シミュレーション部品の上りマッピング処理です。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @param prcKmkCd 料金項目コード
	 * @throws RequestParameterException
	 */
	private void setPrcSimParam(IRequestParameterReadWrite param, String fixedText, String pcrsCd, String pplanCd, String prcKmkCd)
			throws RequestParameterException
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング　2013.04.26：機能コード(2→1)変更
		parentMap.put(JCMConstants.FUNC_CODE_KEY, JPCModelConstant.FUNC_CD_1);

		// シミュレーション依頼リスト
		ArrayList arrayList = new ArrayList<HashMap>();
		HashMap detailMap1 = new HashMap();
		HashMap detailMap2 = new HashMap();

		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// 【例-1】 100Mの基本料金から料金シミュレーション通常割３年目を求める場合
		//          S1200100301：料金シミュレーション通常割３年目
		//
		// [detailMap1] key_pcrs_cd=A03、key_prc_plan_cd=全スペース、key_prc_kmk_cd=S1200100301  → 「料金シミュレーション集計(AC_M_PRC_SIML_SHUK)」の情報取得用
		// [detailMap2] key_pcrs_cd=A03、key_prc_plan_cd=PA0301、key_prc_kmk_cd=ブランク → 100Mの基本料金取得用

		// 【例-2】 100MLの下限の基本料金から料金シミュレーション通常割３年目を求める場合
		//          S1200101301：料金シミュレーション通常割３年目  ※呼出元には S1200100301 で返却
		//
		// [detailMap1] key_pcrs_cd=A03、key_prc_plan_cd=全スペース、key_prc_kmk_cd=S1200101301  → 「料金シミュレーション集計(AC_M_PRC_SIML_SHUK)」の情報取得用
		// [detailMap2] key_pcrs_cd=A03、key_prc_plan_cd=PA0301、key_prc_kmk_cd=ブランク → 100MLの下限の基本料金取得用
		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

		// 料金コースコード
		detailMap1.put(KEY_PCRS_CD, pcrsCd);
		detailMap2.put(KEY_PCRS_CD, pcrsCd);

		// 料金プランコード
		detailMap1.put(KEY_PRC_PLAN_CD, SPACE_12KETA);
		detailMap2.put(KEY_PRC_PLAN_CD, pplanCd);

		// 料金項目コード
		detailMap1.put(KEY_PRC_KMK_CD, prcKmkCd);
		detailMap2.put(KEY_PRC_KMK_CD, null);

		arrayList.add(detailMap1);
		arrayList.add(detailMap2);
		parentMap.put(JACPrcSimulationMsg.JACPrcSimulationMSG1LIST, arrayList);

		// シミュレーション結果リスト
		ArrayList resList = new ArrayList<HashMap>();
		HashMap detailMap = new HashMap();
		resList.add(detailMap);
		parentMap.put(JACPrcSimulationMsg.JACPrcSimulationMSG2LIST, resList);

		param.setData(fixedText, parentMap);
	}

	/**
	 * 料金プラン従量単価一意照会の上りマッピング処理です。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @throws RequestParameterException
	 */
	private void setEKK0611A010(IRequestParameterReadWrite param, String fixedText, String pcrsCd, String pplanCd) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap usrData = (HashMap)param.getData(fixedText);

		if (usrData != null && usrData.size() > 0)
		{
			// 機能コード設定
			setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

			// 料金コースコード
			usrData.put(EKK0611A010CBSMsg.KEY_PCRS_CD, pcrsCd);
			// 料金プランコード
			usrData.put(EKK0611A010CBSMsg.KEY_PPLAN_CD, pplanCd);
			// 料金プラン単価種別コード
			usrData.put(EKK0611A010CBSMsg.KEY_PPLAN_TANKA_SBT_CD, JFUStrConst.CD01111_K01);
			// 契約状態種別コード
			usrData.put(EKK0611A010CBSMsg.KEY_KEI_STAT_SBT_CD, JFUStrConst.CD01112_01);
			// 世代登録年月日時分秒
			usrData.put(EKK0611A010CBSMsg.KEY_GENE_ADD_DTM, null);
			// 予約適用年月日
			usrData.put(EKK0611A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
		}
	}

	/**
	 * 料金シミュレーション部品の下りマッピング処理です。
	 * @param dataMap INマップ
	 * @return 結果マップ
	 */
	private HashMap getJACPrcSimulation(HashMap dataMap)
	{
		HashMap resultMap = new HashMap();
		ArrayList resultList = new ArrayList();

		// シミュレーション依頼リスト
		ArrayList<HashMap> childList01 = getDTLList(dataMap, JACPrcSimulationMsg.JACPrcSimulationMSG1LIST);
		// シミュレーション結果リスト
		ArrayList<HashMap> childList02 = getDTLList(dataMap, JACPrcSimulationMsg.JACPrcSimulationMSG2LIST);

		if (childList01 != null && childList02 != null)
		{
			for (int i = 0; i < childList02.size(); i++)
			{
				HashMap childMap01 = childList01.get(0);
				HashMap childMap02 = childList02.get(i);

				// ＫＥＹ＿料金項目コードを設定
				String prcKmkCd = (String)childMap01.get(KEY_PRC_KMK_CD);
				// 返却時の科目コードを設定する
				prcKmkCd = getKeyKmkCd(prcKmkCd);

				childMap02.put(KEY_PRC_KMK_CD, prcKmkCd);

				// シミュレーション結果リストのマップを明細(返却)リストに格納
				resultList.add(childMap02);
			}
		}

		// 返却マップに格納
		resultMap.put(JACPrcSimulationMsg.JACPrcSimulationMSG2LIST, resultList);

		return resultMap;
	}

	/**
	 * 料金プラン従量単価一意照会の下りマッピング処理です。
	 * <br>
	 * @param dataMap INマップ
	 * @return 結果マップ
	 */
	private HashMap getEKK0611A010(HashMap dataMap)
	{
		HashMap resultMap = new HashMap();
		ArrayList resultList = new ArrayList();

		// ※一意照会なので明細リストは1件になる
		ArrayList<HashMap> childList = getDTLList(dataMap, EKK0611A010CBSMsg.EKK0611A010CBSMSG1LIST);

		if (childList != null && childList.size() > 0)
		{
			for (HashMap childMap : childList)
			{
				HashMap outMap = new HashMap();
				// 上限額
				outMap.put(EKK0611A010CBSMsg1List.UPPL_AMNT, childMap.get(EKK0611A010CBSMsg1List.UPPL_AMNT));
				// 下限額
				outMap.put(EKK0611A010CBSMsg1List.LOWL_AMNT, childMap.get(EKK0611A010CBSMsg1List.LOWL_AMNT));
				// 料金プラン従量金額
				outMap.put(EKK0611A010CBSMsg1List.PPLAN_JURYO_AMNT, childMap.get(EKK0611A010CBSMsg1List.PPLAN_JURYO_AMNT));
				// 料金プラン従量単位コード
				outMap.put(EKK0611A010CBSMsg1List.PPLAN_JURYO_TANI_CD, childMap.get(EKK0611A010CBSMsg1List.PPLAN_JURYO_TANI_CD));
				// 料金プラン従量単位コード名称
				outMap.put(EKK0611A010CBSMsg1List.PPLAN_JURYO_TANI_CD_NM, childMap.get(EKK0611A010CBSMsg1List.PPLAN_JURYO_TANI_CD_NM));

				// 明細リストに格納
				resultList.add(outMap);
			}
		}

		// 返却マップに格納
		resultMap.put(EKK0611A010CBSMsg.EKK0611A010CBSMSG1LIST, resultList);

		return resultMap;
	}

	/**
	 * 明細リストを返却します。
	 * <br>
	 * @param dataMap INマップ
	 * @param listNm リスト名
	 * @return 検索結果リスト
	 */
	private ArrayList<HashMap> getDTLList(HashMap dataMap, String listNm)
	{
		// 結果格納用リスト
		ArrayList<HashMap> resultList = new ArrayList<HashMap>();
		// リスト内検索
		ArrayList childList = (ArrayList)dataMap.get(listNm);

		if (childList != null && childList.size() > 0)
		{
			for (int j = 0; j < childList.size(); j++)
			{
				HashMap childMap = (HashMap)childList.get(j);
				resultList.add(childMap);
			}
		}

		return resultList;
	}

	/**
	 * 100MLの従量制か判定します。
	 * @param pcrsCd 料金コース
	 * @param pplanCd 料金プラン
	 * @return true：100ML、false：その他
	 */
	private boolean is100ML(String pcrsCd, String pplanCd)
	{
		if ((JFUStrConst.CD00134_A03.equals(pcrsCd) && JFUStrConst.CD00565_PA0311.equals(pplanCd))
				|| (JFUStrConst.CD00134_A08.equals(pcrsCd) && JFUStrConst.CD00565_PA0811.equals(pplanCd))
				|| (JFUStrConst.CD00134_A03.equals(pcrsCd) && JFUStrConst.CH0391_PRC_SVC_CD_SA0311.equals(pplanCd))
				|| (JFUStrConst.CD00134_A08.equals(pcrsCd) && JFUStrConst.CH0391_PRC_SVC_CD_SA0811.equals(pplanCd)))
		{
			return true;
		}
		return false;
	}

	/**
	 * 料金項目コードリストを設定します。
	 * 
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @return 料金項目コードリスト
	 */
	private List<String> getKihonPrcKmkCdList(String pcrsCd, String pplanCd)
	{

		if (is100ML(pcrsCd, pplanCd))
		{
			// 100Mライトの場合
			return KIHON_PRC_KMK_CD_100ML_LIST;
		}
		// その他
		return KIHON_PRC_KMK_CD_LIST;

	}

	/**
	 * 呼出元に返却する料金項目コードを設定します。
	 * 
	 * @param prcKmkCd 料金項目コード
	 * @return 料金項目コード
	 */
	private String getKeyKmkCd(String prcKmkCd)
	{
		if (RESULT_KIHON_PRC_KMK_MAP.containsKey(prcKmkCd)) {
			// 100Mライトの料金項目コードの場合
			return RESULT_KIHON_PRC_KMK_MAP.get(prcKmkCd);
		}
		// その他
		return prcKmkCd;

	}

	/**
	 * デバッグログ出力
	 * 
	 * <br>
	 * @param inMsg メッセージ
	 */
	private void debugLog(String inMsg)
	{
		JFUBPCommon.printBpDebugLog(this.getClass(), inMsg);
	}

	/**
	 * 料金シミュレーション(AC)部品に料金項目を設定する。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @param prcSimu 料金シミュレーション部品
	 * @throws Exception
	 */
	private void setJACPrcSimulation(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, 
			String pcrsCd, String pplanCd, JACPrcSimulation prcSimu) throws Exception {

		// ●料金シミュレーション(基本料金)
		setPrcSimuMsgList(handle, param, fixedText, pcrsCd, pplanCd, getKihonPrcKmkCdList(pcrsCd, pplanCd), prcSimu);

		// 従量制(100Mライト)が対象の場合は以下を実行
		if (JFUStrConst.CD00134_A03.equals(pcrsCd) && JFUStrConst.CD00565_PA0311.equals(pplanCd)
				|| (JFUStrConst.CD00134_A08.equals(pcrsCd) && JFUStrConst.CD00565_PA0811.equals(pplanCd)))
		{
			// 料金プランコード⇔料金サービスコード変換(HT100Mライト)
			pplanCd = pplanCd.replace(JFUStrConst.CD00565_PA0311, JFUStrConst.CH0391_PRC_SVC_CD_SA0311);
			// 料金プランコード⇔料金サービスコード変換(MZ100Mライト)
			pplanCd = pplanCd.replace(JFUStrConst.CD00565_PA0811, JFUStrConst.CH0391_PRC_SVC_CD_SA0811);
			// ●料金シミュレーション(基本料金) ※上限額取得
			setPrcSimuMsgList(handle, param, fixedText, pcrsCd, pplanCd, getKihonPrcKmkCdList(pcrsCd, pplanCd), prcSimu);
		}

		// シミュレーションリスト読込
		prcSimu.readPrcSimuList(handle, param);

	}

	/**
	 * 料金シミュレーション(AC)部品に料金項目を設定する。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @param pcrKmkCdListNm 料金コードリスト
	 * @param prcSimu 料金シミュレーション部品
	 * @throws Exception
	 */
	private void setPrcSimuMsgList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String pcrsCd,
			String pplanCd, List<String> pcrKmkCdListNm, JACPrcSimulation prcSimu) throws Exception
	{

		for (String prcKmkCd : pcrKmkCdListNm)
		{
			// 上りマッピング
			setPrcSimParam(param, fixedText, pcrsCd, pplanCd, prcKmkCd);
			// 料金依頼リスト追加
			prcSimu.setPrcSimuMsgList(handle, param, fixedText);
		}
	}
}