/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JFUFrontKhrkInfoAreaUtil
 *   ソースファイル名：JFUFrontKhrkInfoAreaUtil.java
 *   作成者          ：富士通
 *   日付            ：2011年08月10日
 *＜機能概要＞
 *   フロント画面基本料金情報領域出力情報を設定する部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/08/10   FJ）        新規作成
 *
 **********************************************************************/
package eo.web.webview.common;

import static com.fujitsu.futurity.web.x31.X31CWebConst.DATABEAN_SET_VALUE;
import static eo.web.webview.common.JFUWebCommon.SEP_N_LAST;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31SWebLog;

import eo.common.constant.JFUStrConst;

/**
 * フロント画面基本料金情報領域出力情報を設定する部品です。
 *
 * <br>
 * @author 富士通
 */
public class JFUFrontKhrkInfoAreaUtil
{

	/** 基本料金 タイトル */
	private static final String BASIC_TITLE = "basic_title";
	/** 基本料金 値 */
	private static final String BASIC_VALUE = "basic_value";

	/** 初期費用 タイトル */
	private static final String INITAL_TITLE = "inital_title";
	/** 初期費用 値 */
	private static final String INITIAL_VALUE = "initial_value";

	/** 基本料金 タイトル値 */
	private static final String DEF_BASIC_TITLE = "月額料金";
	/** 基本料金 サブタイトル値 */
	private static final String DEF_BASIC_SUB_TITLE = "基本料金";

	/** 初期費用 タイトル値 */
	private static final String DEF_INIT_TITLE = "初期費用";

	/** 基本料金 項目名 */
	private static final String PPLAN_KOTEI_TANI_CD_NM = "pplan_kotei_tani_cd_nm";

	/** 基本料金 金額 */
	private static final String PPLAN_KOTEI_AMNT = "pplan_kotei_amnt";

	/** 初期費用 項目名 */
	private static final String TMP_PAY_PRC_NM = "tmp_pay_prc_nm";

	/** 初期費用 金額 */
	private static final String TMP_PAY_PRC_AMNT = "tmp_pay_prc_amnt";

	/** 基本料金 スタイルクラス１ */
	private static final String BASIC_STYLE_CLASS_FIR = "fixed_fee";
	/** 基本料金 スタイルクラス２ */
	private static final String BASIC_SYLE_CLASS_SEC = "default_price_area_col01:default_price_area_col02";

	/** 初期費用 スタイルクラス１*/
	private static final String INIT_STYLE_CLASS_FIR = "initial_cost";
	/** 初期費用 スタイルクラス２ */
	private static final String INIT_SYLE_CLASS_SEC = "default_price_area_col01:default_price_area_col02";

	/** 画面表示定義取得用キー タイトル */
	private static final String TITLE = "title";
	/** 画面表示定義取得用キー スタイル */
	private static final String STYLE = "style";
	/** 画面表示定義取得用キー 備考 */
	private static final String BIKO = "biko";

	/** フロント用画面表示定義ファイル取得用パス(前) */
	private static final String QUERY_FR_PATH = "DISPSETTING/SETTING[@screenId='";
	/** フロント用画面表示定義ファイル取得用コメントパス(後) */
	private static final String QUERY_BK_COMMENT_PATH = "']/DISPCTL[@groupid='PRC_INFO_COMMENT']";
	/** フロント用画面表示定義ファイル取得用基本情報項目パス(後) */
	private static final String QUERY_BK_BASIC_COLUMN_PATH = "']/DISPCTL[@groupid='PRC_BASIC_COLUMN']";
	/** フロント用画面表示定義ファイル取得用基本情報パス(後) */
	private static final String QUERY_BK_BASIC_INFO_PATH = "']/DISPCTL[@groupid='PRC_BASIC_INFO']";
	/** フロント用画面表示定義ファイル取得用初期費用項目パス(後) */
	private static final String QUERY_BK_INIT_COLUMN_PATH = "']/DISPCTL[@groupid='PRC_INIT_COLUMN']";
	/** フロント用画面表示定義ファイル取得用初期費用パス(後) */
	private static final String QUERY_BK_INIT_INFO_PATH = "']/DISPCTL[@groupid='PRC_INIT_INFO']";

	/** 料金プラン固定単価（オプション申込料金）一覧明細 */
	private static final String EKK0601B001_LIST = "EKK0601B001CBSMsg1List";
	/** 初期費用一覧照会明細 */
	private static final String EKK0721A010_LIST = "EKK0721A010CBSMsg1List";
	/** 料金情報エリアリストへのパス */
	private static final String BEAN_PRC_INFO_PATH = "料金情報エリアリスト/0/";

	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";

	/** 半角スペース */
	private static final String HALF_SPACE = " ";

	/**
	 * コメントエリア表示用リスト設定内容をサービスフォームBeanに格納します。 <BR>
	 *
	 * @param titleListArrayAccess データBeanアクセスクラスリスト
	 * @param setCommentSkbtList コメント識別リスト
	 * @param setCommentList コメントエリア表示用リスト
	 * @return
	 */
	public static void setCommentList(X31SDataBeanAccess titleListArrayAccess, List<String> setCommentSkbtList, List<String> setCommentList)
	{

		// パラメータとして渡された「データBeanアクセスクラスリスト」、「コメント識別リスト」、「コメントエリア表示用リスト」が
		// 一つでも「null」の場合は、何も処理を行わない。
		if (null == titleListArrayAccess || null == setCommentSkbtList || null == setCommentList)
		{
			X31SWebLog.DEBUG_LOG.debug("【JFUFrontKhrkInfoAreaUtil.setCommentList】パラメータがnullのため処理停止");
			return;
		}

		titleListArrayAccess.sendMessageString(JFUStrConst.PRC_INFO_COMMENT_AREA_COUNT, X31CWebConst.DATABEAN_SET_VALUE, String
				.valueOf(setCommentList.size()));

		X31SDataBeanAccessArray commentListArray = titleListArrayAccess.getDataBeanArray(JFUStrConst.PRC_INFO_COMMENT_LIST);

		for (int i = 0; i < setCommentList.size(); i++)
		{

			// コメント識別リスト数がコメントエリア表示用リスト数より、少ないかチェックする。
			// 少ない場合は「コメント識別」には、カウントを設定する。
			String commentSkbt = String.valueOf(i);
			if (i < setCommentSkbtList.size())
			{
				commentSkbt = setCommentSkbtList.get(i);
			}

			X31SDataBeanAccess commentListDataType = commentListArray.addDataBean();
			commentListDataType.sendMessageString(JFUStrConst.PRC_INFO_COMMENT_SKBT, X31CWebConst.DATABEAN_SET_VALUE, commentSkbt);
			commentListDataType.sendMessageString(JFUStrConst.PRC_INFO_COMMENT, X31CWebConst.DATABEAN_SET_VALUE, setCommentList.get(i));

		}
	}

	/**
	 * 備考エリア表示用リスト設定内容をサービスフォームBeanに格納します。 <BR>
	 *
	 * @param titleListArrayAccess データBeanアクセスクラスリスト
	 * @param setBikoSkbtList 備考識別リスト
	 * @param setBikoList 備考エリア表示用リスト
	 * @return
	 */
	public static void setBikoList(X31SDataBeanAccess titleListArrayAccess, List<String> setBikoSkbtList, List<String> setBikoList)
	{

		// パラメータとして渡された「データBeanアクセスクラスリスト」、「備考識別リスト」、「備考エリア表示用リスト」が
		// 一つでも「null」の場合は、何も処理を行わない。
		if (null == titleListArrayAccess || null == setBikoSkbtList || null == setBikoList)
		{
			X31SWebLog.DEBUG_LOG.debug("【JFUFrontKhrkInfoAreaUtil.setBikoList】パラメータがnullのため処理停止");
			return;
		}

		titleListArrayAccess.sendMessageString(JFUStrConst.PRC_INFO_BIKO_AREA_COUNT, X31CWebConst.DATABEAN_SET_VALUE, String
				.valueOf(setBikoList.size()));

		X31SDataBeanAccessArray bikotListArray = titleListArrayAccess.getDataBeanArray(JFUStrConst.PRC_INFO_BIKO_LIST);

		for (int i = 0; i < setBikoList.size(); i++)
		{

			X31SDataBeanAccess bikoListDataType = bikotListArray.addDataBean();

			// 備考識別リスト数が備考エリア表示用リスト数より、少ないかチェックする。
			// 少ない場合は「備考識別」には、カウントを設定する。
			String bikoSkbt = String.valueOf(i);
			if (i < setBikoSkbtList.size())
			{
				bikoSkbt = setBikoSkbtList.get(i);
			}

			bikoListDataType.sendMessageString(JFUStrConst.PRC_INFO_BIKO_SKBT, X31CWebConst.DATABEAN_SET_VALUE, bikoSkbt);
			bikoListDataType.sendMessageString(JFUStrConst.PRC_INFO_BIKO, X31CWebConst.DATABEAN_SET_VALUE, setBikoList.get(i));

		}
	}

	/**
	 * テーブルタイトルエリア表示用リスト設定内容をサービスフォームBeanに格納します。 <BR>
	 *
	 * @param titleListArrayAccess データBeanアクセスクラスリスト
	 * @param setTableTitleSkbtList テーブルタイトル識別リスト
	 * @param setTableTitleList テーブルタイトルエリア表示用リスト
	 * @param setTableStyleClass1List テーブルスタイルクラス１用リスト
	 * @param setTableStyleClass2List テーブルスタイルクラス２用リスト
	 * @param tableValueMap テーブルの値格納MAP
	 * @return
	 */
	public static void setTableTitleList(X31SDataBeanAccess titleListArrayAccess, List<String> setTableTitleSkbtList,
			List<String> setTableTitleList, List<String> setTableStyleClass1List, List<String> setTableStyleClass2List,
			Map<String, List<String>> tableValueMap)
	{

		// タイトルの表示数
		int titleCount = 0;

		// パラメータとして渡された「データBeanアクセスクラスリスト」が「null」の場合は、何も処理を行わない。
		if (null == titleListArrayAccess)
		{
			X31SWebLog.DEBUG_LOG.debug("【JFUFrontKhrkInfoAreaUtil.setTableTitleList】パラメータ(データBeanアクセスクラスリスト)がnullのため処理停止");
			return;
		}

		// パラメータとして渡された「データBeanアクセスクラスリスト」、「テーブルタイトル識別リスト」、「テーブルタイトルエリア表示用リスト」
		// 「テーブルスタイルクラス１用リスト」、「テーブルスタイルクラス２用リスト」、「テーブルの値格納MAP」が
		// 一つでも「null」の場合は、何も処理を行わない。
		if (isNullTableTitleParam(titleListArrayAccess, setTableTitleSkbtList, setTableTitleList, setTableStyleClass1List,
				setTableStyleClass2List, tableValueMap))
		{
			// 料金情報エリア数(タイトルの表示数)を設定する。
			titleListArrayAccess.sendMessageString(JFUStrConst.PRC_INFO_PRC_INFO_AREA_COUNT, X31CWebConst.DATABEAN_SET_VALUE, String
					.valueOf(titleCount));
			X31SWebLog.DEBUG_LOG.debug("【JFUFrontKhrkInfoAreaUtil.setTableTitleList】パラメータ(テーブル情報)がnullのため処理停止");
			return;
		}

		X31SDataBeanAccessArray titleListArray = titleListArrayAccess.getDataBeanArray(JFUStrConst.PRC_INFO_TITLE_LIST);

		for (int i = 0; i < setTableTitleList.size(); i++)
		{

			// KEYは『タイトル名 + タイトル番号(0から始まる連番) + テーブル値識別リスト設定キー』
			List<String> setTableValueSkbtList =
					tableValueMap.get(setTableTitleList.get(i) + String.valueOf(i) + JFUStrConst.KEY_TABLE_VALUE_SKBT_LIST);
			// KEYは『タイトル名 + タイトル番号(0から始まる連番) + テーブル左値リスト設定キー』
			List<String> setTableLeftValueList =
					tableValueMap.get(setTableTitleList.get(i) + String.valueOf(i) + JFUStrConst.KEY_TABLE_LEFT_VALUE_LIST);
			// KEYは『タイトル名 + タイトル番号(0から始まる連番) + テーブル右値リスト設定キー』
			List<String> setTableRightValueList =
					tableValueMap.get(setTableTitleList.get(i) + String.valueOf(i) + JFUStrConst.KEY_TABLE_RIGHT_VALUE_LIST);

			// パラメータとして渡された「テーブルの値格納MAP」に設定されている
			// 『テーブル左値リスト設定キー』が「null」の場合は、何も処理を行わない。
			if (null == setTableLeftValueList)
			{
				// 料金情報エリア数(タイトルの表示数)を設定する。
				titleListArrayAccess.sendMessageString(JFUStrConst.PRC_INFO_PRC_INFO_AREA_COUNT, X31CWebConst.DATABEAN_SET_VALUE, String
						.valueOf(titleCount));
				X31SWebLog.DEBUG_LOG.debug("【JFUFrontKhrkInfoAreaUtil.setTableTitleList】パラメータ(左値情報)がnullのため処理停止");
				return;
			}

			// 料金情報エリア数(タイトルの表示数)をカウントする。
			titleCount++;

			// タイトル識別子リスト数がタイトルリスト数より、少ないかチェックする。
			// 少ない場合は「タイトル識別子」には、カウントを設定する。
			String titleSkbt = String.valueOf(i);
			if (i < setTableTitleSkbtList.size())
			{
				titleSkbt = setTableTitleSkbtList.get(i);
			}

			// テーブルスタイルクラス１用リスト数がタイトルリスト数より、少ないかチェックする。
			// 少ない場合は「テーブルスタイルクラス１」には、『""(空文字)』を設定する。
			String styleClass1 = "";
			if (i < setTableStyleClass1List.size())
			{
				styleClass1 = setTableStyleClass1List.get(i);
			}

			// テーブルスタイルクラス２用リスト数がタイトルリスト数より、少ないかチェックする。
			// 少ない場合は「テーブルスタイルクラス２」には、『""(空文字)』を設定する。
			String styleClass2 = "";
			if (i < setTableStyleClass2List.size())
			{
				styleClass2 = setTableStyleClass2List.get(i);
			}

			X31SDataBeanAccess titleListDataType = titleListArray.addDataBean();
			titleListDataType.sendMessageString(JFUStrConst.PRC_INFO_TITLE_SKBT, X31CWebConst.DATABEAN_SET_VALUE, titleSkbt);
			titleListDataType.sendMessageString(JFUStrConst.PRC_INFO_TITLE, X31CWebConst.DATABEAN_SET_VALUE, setTableTitleList.get(i));
			titleListDataType.sendMessageString(JFUStrConst.PRC_INFO_TABLE_STYLE_CLASS_1, X31CWebConst.DATABEAN_SET_VALUE, styleClass1);
			titleListDataType.sendMessageString(JFUStrConst.PRC_INFO_TABLE_STYLE_CLASS_2, X31CWebConst.DATABEAN_SET_VALUE, styleClass2);

			X31SDataBeanAccessArray valueListArray = titleListDataType.getDataBeanArray(JFUStrConst.PRC_INFO_VALUE_LIST);

			// 値行の表示数
			int valueRowCount = 0;
			for (int j = 0; j < setTableLeftValueList.size(); j++)
			{

				// 左値を空で表示させる為に、コメントアウト
				//
				// // 取得した「左値」が、『null』または『""(空文字)』の場合
				// if (null == setTableLeftValueList.get(j) ||
				// "".equals(setTableLeftValueList.get(j)))
				// {
				// // 値行は表示させない。
				// continue;
				// }

				// 値識別子リスト数が左値リスト数より、少ないかチェックする。
				// 少ない場合は「値識別子」には、カウントを設定する。
				String tableValueSkbt = String.valueOf(j);
				if (null != setTableValueSkbtList && j < setTableValueSkbtList.size())
				{
					tableValueSkbt = setTableValueSkbtList.get(j);
				}

				// 右値リスト数が左値リスト数より、少ないかチェックする。
				// 少ない場合は「右値」には、『""(空文字)』を設定する。
				String tableRightValue = "";
				if (null != setTableRightValueList && j < setTableRightValueList.size())
				{
					tableRightValue = setTableRightValueList.get(j);
				}

				X31SDataBeanAccess valueListDataType = valueListArray.addDataBean();
				valueListDataType.sendMessageString(JFUStrConst.PRC_INFO_VALUE_SKBT, X31CWebConst.DATABEAN_SET_VALUE, tableValueSkbt);
				valueListDataType.sendMessageString(JFUStrConst.PRC_INFO_LEFT_VALUE, X31CWebConst.DATABEAN_SET_VALUE, setTableLeftValueList
						.get(j));
				valueListDataType.sendMessageString(JFUStrConst.PRC_INFO_RIGHT_VALUE, X31CWebConst.DATABEAN_SET_VALUE, tableRightValue);
				valueRowCount++;

			}
			// 値行の表示数を設定する。
			titleListDataType.sendMessageString(JFUStrConst.PRC_INFO_VALUE_AREA_COUNT, X31CWebConst.DATABEAN_SET_VALUE, String
					.valueOf(valueRowCount));
		}
		// 料金情報エリア数(タイトルの表示数)を設定する。
		titleListArrayAccess.sendMessageString(JFUStrConst.PRC_INFO_PRC_INFO_AREA_COUNT, X31CWebConst.DATABEAN_SET_VALUE, String
				.valueOf(titleCount));
	}

	/**
	 * テーブルタイトルエリア表示用リスト設定内容のパラメータにnullのものが存在するか判定します。 <BR>
	 *
	 * @param titleListArrayAccess データBeanアクセスクラスリスト
	 * @param setTableTitleSkbtList テーブルタイトル識別リスト
	 * @param setTableTitleList テーブルタイトルエリア表示用リスト
	 * @param setTableStyleClass1List テーブルスタイルクラス１用リスト
	 * @param setTableStyleClass2List テーブルスタイルクラス２用リスト
	 * @param tableValueMap テーブルの値格納MAP
	 * @return true:パラメータが一つでもnullの場合、false:パラメータがすべてnullでない場合
	 */
	private static boolean isNullTableTitleParam(X31SDataBeanAccess titleListArrayAccess, List<String> setTableTitleSkbtList,
			List<String> setTableTitleList, List<String> setTableStyleClass1List, List<String> setTableStyleClass2List,
			Map<String, List<String>> tableValueMap)
	{
		return (null == setTableTitleSkbtList || null == setTableTitleList || null == setTableStyleClass1List
				|| null == setTableStyleClass2List || null == tableValueMap);
	}

	/**
	 * 無料表示用の料金情報を設定します。
	 *
	 * <br>
	 * @param outputMap サービスの実行結果
	 * @param basePrcScNm 基本料金情報取得キー
	 * @throws Exception 例外
	 */
	public static void setFreePrcInfoMap(HashMap<String, Object> outputMap, String basePrcScNm) throws Exception
	{
		if (null == outputMap || null == basePrcScNm || 0 == basePrcScNm.length())
		{
			return;
		}
		HashMap<String, Object> parentMap = null;
		if (!outputMap.containsKey(basePrcScNm))
		{
			parentMap = new HashMap<String, Object>();
			outputMap.put(basePrcScNm, parentMap);
		}
		else
		{
			parentMap = (HashMap<String, Object>)outputMap.get(basePrcScNm);
		}

		ArrayList<HashMap<String, Object>> childList = getDetailList(outputMap, basePrcScNm, EKK0601B001_LIST);
		if (null == childList || 0 == childList.size())
		{
			childList = new ArrayList<HashMap<String, Object>>();
			HashMap<String, Object> childMap = new HashMap<String, Object>();
			childList.add(childMap);
			parentMap.put(EKK0601B001_LIST, childList);
		}

		for (int i = 0; i < childList.size(); i++)
		{
			HashMap<String, Object> childMap = childList.get(i);
			// 基本料金 金額の値部分に「無料」を設定
			childMap.put(PPLAN_KOTEI_AMNT, JFUStrConst.FREE_LABEL);
		}
	}

	/**
	 * 料金情報をサービスフォームBeanへ格納します。
	 *
	 * <br>
	 * @param bean サービスフォームBean
	 * @param outputMap サービスの実行結果
	 * @param basePrcScNm 基本料金情報取得キー(料金プラン固定単価(オプション申込料金)一覧照会の実行結果取得キー)
	 * @param initPrcCcNm 初期費用情報取得キー(初期費用取得CC実行結果取得キー)
	 * @param gamenId 画面ID 例)"FUW0XXXX"
	 * @throws Exception 例外
	 */
	public static void setPrcInfoArea(X31SDataBeanAccess bean, HashMap<String, Object> outputMap, String basePrcScNm, String initPrcCcNm,
			String gamenId) throws Exception
	{

		/*
		 * 使用するにあたっての前提
		 *
		 * 下記のレイアウトにあう場合に使用できます。
		 * ===================================
		 * コメント１                 ←必要な場合フロント用画面表示定義ファイルで定義
		 * コメント２                 ←必要な場合フロント用画面表示定義ファイルで定義
		 * ┏━━━━━━━━━━━┓
		 * ┃月額料金　　　　　　　┃ ←フロント用画面表示定義ファイルへの定義で変更可
		 * ┣━━━━━┳━━━━━┫ ←左：フロント用画面表示定義ファイルへの定義で変更可
		 * ┃基本料金１┃100円/申込┃ ←右：料金プラン固定単価明細リスト１
		 * ┣━━━━━╋━━━━━┫ ←左：フロント用画面表示定義ファイルへの定義で変更可
		 * ┃基本料金２┃200円/申込┃ ←右：←料金プラン固定単価明細リスト２
		 * ┗━━━━━┻━━━━━┛
		 * 備考１                     ←必要な場合フロント用画面表示定義ファイルで定義
		 *
		 * ┏━━━━━━━━━━━┓
		 * ┃初期費用　　　　　　　┃ ←フロント用画面表示定義ファイルへの定義で変更可
		 * ┣━━━━━┳━━━━━┫
		 * ┃左値　　　┃右値　　　┃ ←初期費用一覧照会明細リスト１
		 * ┣━━━━━╋━━━━━┫
		 * ┃左値　　　┃右値　　　┃ ←初期費用一覧照会明細リスト２
		 * ┣━━━━━╋━━━━━┫
		 * ┃左値　　　┃右値　　　┃ ←初期費用一覧照会明細リスト３
		 * ┗━━━━━┻━━━━━┛
		 * 備考２                     ←必要な場合フロント用画面表示定義ファイルで定義
		 *
		 * ===================================
		 *
		 * ●表示内容をカスタマイズする場合
		 * 　フロント用画面表示定義ファイルに定義を記述した場合に
		 * 　その設定が有効になります。
		 *
		 * フロント用画面表示定義ファイル
		 * 記入例）
		 * <!-- 料金情報 コメント 識別子(id名),コメント -->(省略可、デフォルト非表示)
		 * <DISPCTL groupid="PRC_INFO_COMMENT" id="0">commentIdNm1,コメント１</DISPCTL>
		 * <DISPCTL groupid="PRC_INFO_COMMENT" id="1">commentIdNm2,コメント２</DISPCTL>
		 *
		 * <!-- 基本料金 テーブル スタイルのクラス名１,スタイルのクラス名２ -->
		 * (省略可、デフォルト値：fixed_fee,default_price_area_col01:default_price_area_col02)
		 * <DISPCTL groupid="PRC_BASIC_INFO" id="style">tableClassNm1,tableClassNm2:tableClassNm3</DISPCTL>
		 *
		 * <!-- 基本料金 タイトル 識別子(id名),タイトル名 -->(省略可、デフォルト値：月額料金)
		 * <DISPCTL groupid="PRC_BASIC_INFO" id="titile">titleIdNm1,基本料金</DISPCTL>
		 *
		 * <!-- 基本料金 備考 識別子(id名),備考 -->(省略可、デフォルト非表示)
		 * <DISPCTL groupid="PRC_BASIC_INFO" id="biko">bikoIdNm1,備考１</DISPCTL>
		 *
		 * <!-- 基本料金 識別子(id名),左値 -->(省略可、デフォルト：基本料金)
		 * <DISPCTL groupid="PRC_BASIC_COLUMN" id="0">baseIdNm1,月額料金１</DISPCTL>
		 * <DISPCTL groupid="PRC_BASIC_COLUMN" id="1">baseIdNm2,月額料金２</DISPCTL>
		 *
		 * <!-- 初期費用 テーブル スタイルのクラス名１,スタイルのクラス名２ -->
		 * (省略可、デフォルト値：initial_cost,default_price_area_col01:default_price_area_col02)
		 * <DISPCTL groupid="PRC_INIT_INFO" id="style">tableClassNm1,tableClassNm2:tableClassNm3</DISPCTL>
		 *
		 * <!-- 初期費用 タイトル 識別子(id名),タイトル名 -->(省略可、デフォルト値：初期費用)
		 * <DISPCTL groupid="PRC_INIT_INFO" id="title">titleIdNm2,初期費用</DISPCTL>
		 * <!-- 初期費用 備考 識別子(id名),備考 -->(省略可)
		 * <DISPCTL groupid="PRC_INIT_INFO" id="biko">bikoIdNm2,備考２</DISPCTL>
		 * <!-- 初期費用 識別子(id名) -->(省略可)
		 * <DISPCTL groupid="PRC_INIT_COLUMN" id="0">initIdNm1</DISPCTL>
		 * <DISPCTL groupid="PRC_INIT_COLUMN" id="1">initIdNm2</DISPCTL>
		 * <DISPCTL groupid="PRC_INIT_COLUMN" id="2">initIdNm3</DISPCTL>
		 */

		// ***********************************************************************
		// タイトル・値リスト・備考・テーブルスタイル情報設定処理
		// ***********************************************************************
		// ●基本料金/初期費用情報定処理
		int count = setPrcInfo(bean, outputMap, basePrcScNm, initPrcCcNm, gamenId);

		if (0 < count)
		{
			// ***********************************************************************
			// コメントエリア情報設定処理
			// ***********************************************************************
			// ●コメントエリア情報をフロント用画面表示定義ファイルより取得
			String[] commentArray =
					{ JFUStrConst.PRC_INFO_COMMENT_AREA_COUNT, JFUStrConst.PRC_INFO_COMMENT_LIST, JFUStrConst.PRC_INFO_COMMENT_SKBT,
							JFUStrConst.PRC_INFO_COMMENT };

			// プロパティファイル取得文字列(コメント)
			setComments(bean,
					new StringBuffer(32).append(QUERY_FR_PATH).append(gamenId).append(QUERY_BK_COMMENT_PATH).toString(), commentArray,
					gamenId);
		}
	}

	/**
	 * コメント情報をサービスフォームBeanへ格納します。
	 *
	 * <br>
	 * @param bean サービスフォームBean
	 * @param queryPrcInfoPath フロント用画面表示定義ファイル検索キー
	 * @param array コメント関連情報
	 * @param gamenId 画面ID
	 * @throws Exception 例外
	 */
	private static void setComments(X31SDataBeanAccess bean, String queryPrcInfoPath, String[] array, String gamenId)
			throws Exception
	{
		// ●プロパティより情報取得
		int lastIndex = 0;
		Map<String, String> map = JFUWebCommon.getDispItemsAsMap(queryPrcInfoPath, QUERY_ATTR_NAME);
		if (null != map && 0 != map.size())
		{
			TreeMap<String, String> treeMapObj = new TreeMap<String, String>();
			treeMapObj.putAll(map);
			lastIndex = Integer.parseInt(treeMapObj.lastKey()) + 1;
			for (int i = 0; i < lastIndex; i++)
			{
				X31SDataBeanAccess subBean = null;
				subBean =
						JFUWebCommon.createAndGetDataBeanTypeByPath(bean, new StringBuffer(64).append(BEAN_PRC_INFO_PATH).append(array[1])
								.append(SEP_N_LAST).toString(), i);
				String key = String.valueOf(i);
				if (map.containsKey(key))
				{
					String[] values = map.get(key).split(JFUStrConst.COMMA);
					int valsSize = values.length;
					if (1 < valsSize)
					{
						// 料金情報:コメントを設定
						subBean.sendMessageString(array[3], DATABEAN_SET_VALUE, values[1]);
					}
					if (0 < valsSize)
					{
						// 料金情報:各識別子を設定
						subBean.sendMessageString(array[2], DATABEAN_SET_VALUE, values[0]);
					}
				}
			}
		}
		// コメント数
		JFUWebCommon.setDataBeanItemByPath(bean, new StringBuffer(64).append(BEAN_PRC_INFO_PATH).append(array[0]).toString(), String
				.valueOf(lastIndex));
	}

	/**
	 * 基本料金/初期費用情報をサービスフォームBeanへ格納します。
	 *
	 * <br>
	 * @param bean サービスフォームBean
	 * @param outputMap サービスの実行結果
	 * @param basePrcScNm 基本料金情報取得キー
	 * @param initPrcCcNm 初期費用情報取得キー
	 * @param gamenId 画面ID 例)"FUW0XXXX"
	 * @return 料金情報エリア数
	 * @throws Exception 例外
	 */
	private static int setPrcInfo(X31SDataBeanAccess bean, HashMap<String, Object> outputMap, String basePrcScNm, String initPrcCcNm,
			String gamenId) throws Exception
	{
		int count = 0;

		// 基本料金明細リストを取得
		ArrayList<HashMap<String, Object>> basicPrcInfoList = getDetailList(outputMap, basePrcScNm, EKK0601B001_LIST);
		// ●基本料金
		int bikoCount = 0;
		if (null != basicPrcInfoList)
		{
			Map<String, String> basicColumnMap =
					JFUWebCommon.getDispItemsAsMap(new StringBuffer(32).append(QUERY_FR_PATH).append(gamenId).append(
							QUERY_BK_BASIC_COLUMN_PATH).toString(), QUERY_ATTR_NAME);

			int basicPrcInfoSize = basicPrcInfoList.size();
			String basicVal = null;
			for (int j = 0; j < basicPrcInfoSize; j++)
			{
				X31SDataBeanAccess subBean =
						JFUWebCommon.createAndGetDataBeanTypeByPath(bean, new StringBuffer(64).append(BEAN_PRC_INFO_PATH).append(
								JFUStrConst.PRC_INFO_TITLE_LIST).append(JFUStrConst.SLASH).append(count).append(JFUStrConst.SLASH).append(
								JFUStrConst.PRC_INFO_VALUE_LIST).append(SEP_N_LAST).toString(), j);

				// 明細リストから項目マップを取得
				HashMap<String, Object> childMap = basicPrcInfoList.get(j);
				String key = String.valueOf(j);
				String basicValId = getMapValue(basicColumnMap, key, 0, new StringBuffer(16).append(BASIC_VALUE).append(key).toString());
				basicVal = getMapValue(basicColumnMap, key, 1, basicVal);
				if (null == basicVal)
				{
					basicVal = DEF_BASIC_SUB_TITLE;
				}

				// 値識別子
				subBean.sendMessageString(JFUStrConst.PRC_INFO_VALUE_SKBT, X31CWebConst.DATABEAN_SET_VALUE, basicValId);
				// 左値
				subBean.sendMessageString(JFUStrConst.PRC_INFO_LEFT_VALUE, X31CWebConst.DATABEAN_SET_VALUE, basicVal);

				
				
				// 追加機能（ロジックで値が設定されている場合のみ上書きする。
				String pplanKoteiTitle = (String)childMap.get("pplan_kotei_title");
				if (!JFUWebCommon.isNull(pplanKoteiTitle)) {
					String[] mapValues = pplanKoteiTitle.split(JFUStrConst.COMMA);
					// 値識別子
					subBean.sendMessageString(JFUStrConst.PRC_INFO_VALUE_SKBT, X31CWebConst.DATABEAN_SET_VALUE, mapValues[0]);
					// 左値
					subBean.sendMessageString(JFUStrConst.PRC_INFO_LEFT_VALUE, X31CWebConst.DATABEAN_SET_VALUE, mapValues[1]);
				}
				

				if (JFUStrConst.FREE_LABEL.equals(childMap.get(PPLAN_KOTEI_AMNT)))
				{
					// 無料の場合は「無料」のみを表示
					subBean.sendMessageString(JFUStrConst.PRC_INFO_RIGHT_VALUE, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.FREE_LABEL);
				}
				else
				{
					// 右値
					subBean.sendMessageString(JFUStrConst.PRC_INFO_RIGHT_VALUE, X31CWebConst.DATABEAN_SET_VALUE, new StringBuffer(64).append(
							JFUWebCommon.formatNumber((String)childMap.get(PPLAN_KOTEI_AMNT))).append(HALF_SPACE).append(
							childMap.get(PPLAN_KOTEI_TANI_CD_NM)).toString());
				}
			}

			int[] countArray = { basicPrcInfoSize, bikoCount, count };
			String[] strArray = { QUERY_BK_BASIC_INFO_PATH, BASIC_TITLE, DEF_BASIC_TITLE, BASIC_STYLE_CLASS_FIR, BASIC_SYLE_CLASS_SEC };
			bikoCount = setPrcInfoSubInfo(bean, gamenId, countArray, strArray);
			count = 0 == basicPrcInfoSize ? 0 : 1;
		}

		// 初期費用明細リストを取得
		ArrayList<HashMap<String, Object>> initPrcInfoList = getDetailList(outputMap, initPrcCcNm, EKK0721A010_LIST);
		// ●初期費用
		if (null != initPrcInfoList)
		{
			Map<String, String> initPrcInfoMap =
					JFUWebCommon.getDispItemsAsMap(new StringBuffer(32).append(QUERY_FR_PATH).append(gamenId).append(
							QUERY_BK_INIT_COLUMN_PATH).toString(), QUERY_ATTR_NAME);
			int initPrcInfoSize = initPrcInfoList.size();
			for (int j = 0; j < initPrcInfoSize; j++)
			{
				X31SDataBeanAccess subBean =
						JFUWebCommon.createAndGetDataBeanTypeByPath(bean, new StringBuffer(64).append(BEAN_PRC_INFO_PATH).append(
								JFUStrConst.PRC_INFO_TITLE_LIST).append(JFUStrConst.SLASH).append(count).append(JFUStrConst.SLASH).append(
								JFUStrConst.PRC_INFO_VALUE_LIST).append(SEP_N_LAST).toString(), j);
				// 明細リストから項目マップを取得
				HashMap<String, Object> childMap = initPrcInfoList.get(j);
				String key = String.valueOf(j);
				String value = getMapValue(initPrcInfoMap, key, new StringBuffer(16).append(INITIAL_VALUE).append(key).toString());
				// 値識別子
				subBean.sendMessageString(JFUStrConst.PRC_INFO_VALUE_SKBT, X31CWebConst.DATABEAN_SET_VALUE, value);
				// 左値
				subBean.sendMessageString(JFUStrConst.PRC_INFO_LEFT_VALUE, X31CWebConst.DATABEAN_SET_VALUE, (String)childMap
						.get(TMP_PAY_PRC_NM));
				// 右値
				subBean.sendMessageString(JFUStrConst.PRC_INFO_RIGHT_VALUE, X31CWebConst.DATABEAN_SET_VALUE, new StringBuffer(64).append(
						JFUWebCommon.formatNumber((String)childMap.get(TMP_PAY_PRC_AMNT))).append(HALF_SPACE).append(JFUStrConst.YEN).toString());
			}

			int[] countArray = { initPrcInfoSize, bikoCount, count };
			String[] strArray = { QUERY_BK_INIT_INFO_PATH, INITAL_TITLE, DEF_INIT_TITLE, INIT_STYLE_CLASS_FIR, INIT_SYLE_CLASS_SEC };
			bikoCount = setPrcInfoSubInfo(bean, gamenId, countArray, strArray);
			count += 0 == initPrcInfoSize ? 0 : 1;
		}
		// 備考数
		JFUWebCommon.setDataBeanItemByPath(bean, new StringBuffer(64).append(BEAN_PRC_INFO_PATH).append(
				JFUStrConst.PRC_INFO_BIKO_AREA_COUNT).toString(), String.valueOf(bikoCount));

		// 料金情報エリア数
		JFUWebCommon.setDataBeanItemByPath(bean, new StringBuffer(64).append(BEAN_PRC_INFO_PATH).append(
				JFUStrConst.PRC_INFO_PRC_INFO_AREA_COUNT).toString(), String.valueOf(count));

		return count;
	}

	/**
	 * 基本料金/初期費用(タイトル・スタイル・備考・値数)をサービスフォームBeanへ格納します。
	 *
	 * <br>
	 * @param bean サービスフォームBean
	 * @param gamenId 画面ID(例:FUW0XXXX)
	 * @param count 件数情報(明細数・備考数・料金情報エリア数)
	 * @param array 基本料金/初期費用の設定項目名・識別子
	 * @return 料金情報エリア数
	 * @throws Exception
	 */
	private static int setPrcInfoSubInfo(X31SDataBeanAccess bean, String gamenId, int[] count, String[] array) throws Exception
	{
		if (0 < count[0])
		{
			// ●プロパティより情報取得
			Map<String, String> map =
					JFUWebCommon.getDispItemsAsMap(new StringBuffer(32).append(QUERY_FR_PATH).append(gamenId).append(array[0]).toString(),
							QUERY_ATTR_NAME);

			X31SDataBeanAccess titleBean =
					JFUWebCommon.createAndGetDataBeanTypeByPath(bean, new StringBuffer(64).append(BEAN_PRC_INFO_PATH).append(
							JFUStrConst.PRC_INFO_TITLE_LIST).append(JFUStrConst.SLASH).append(count[2]).toString());
			// タイトル識別子
			titleBean.sendMessageString(JFUStrConst.PRC_INFO_TITLE_SKBT, X31CWebConst.DATABEAN_SET_VALUE, getMapValue(map, TITLE, 0,
					array[1]));

			// タイトル
			titleBean.sendMessageString(JFUStrConst.PRC_INFO_TITLE, X31CWebConst.DATABEAN_SET_VALUE, getMapValue(map, TITLE, 1, array[2]));

			// テーブルスタイルクラス１
			titleBean.sendMessageString(JFUStrConst.PRC_INFO_TABLE_STYLE_CLASS_1, X31CWebConst.DATABEAN_SET_VALUE, getMapValue(map, STYLE,
					0, array[3]));

			// テーブルスタイルクラス２
			titleBean.sendMessageString(JFUStrConst.PRC_INFO_TABLE_STYLE_CLASS_2, X31CWebConst.DATABEAN_SET_VALUE, getMapValue(map, STYLE,
					1, array[4]));

			String bikoId = getMapValue(map, BIKO, 0, null);
			String biko = getMapValue(map, BIKO, 1, null);
			if (null != bikoId || null != biko)
			{
				X31SDataBeanAccess bikoBean =
						JFUWebCommon.createAndGetDataBeanTypeByPath(bean, new StringBuffer(64).append(BEAN_PRC_INFO_PATH).append(
								JFUStrConst.PRC_INFO_BIKO_LIST).append(JFUStrConst.SLASH).append(count[2]).toString());
				// 備考識別子
				bikoBean.sendMessageString(JFUStrConst.PRC_INFO_BIKO_SKBT, X31CWebConst.DATABEAN_SET_VALUE, bikoId);
				// 備考
				bikoBean.sendMessageString(JFUStrConst.PRC_INFO_BIKO, X31CWebConst.DATABEAN_SET_VALUE, biko);
				count[1]++;
			}
		}
		// 値数
		JFUWebCommon.setDataBeanItemByPath(bean, new StringBuffer(64).append(BEAN_PRC_INFO_PATH).append(JFUStrConst.PRC_INFO_TITLE_LIST)
				.append(JFUStrConst.SLASH).append(count[2]).append(JFUStrConst.SLASH).append(JFUStrConst.PRC_INFO_VALUE_AREA_COUNT)
				.toString(), String.valueOf(count[0]));
		return count[1];
	}

	/**
	 * 明細リスト取得します。
	 *
	 * <br>
	 * @param map マップ情報
	 * @param key 取得キー
	 * @param detailKey 明細キー
	 * @return 明細リスト
	 * @throws Exception 例外発生時
	 */
	@SuppressWarnings("unchecked")
	private static ArrayList<HashMap<String, Object>> getDetailList(HashMap<String, Object> map, String key, String detailKey)
			throws Exception
	{
		HashMap<String, Object> parentMap = null;
		if (map.containsKey(key))
		{
			parentMap = (HashMap<String, Object>)map.get(key);
		}
		if (null != parentMap && parentMap.containsKey(detailKey))
		{
			return (ArrayList<HashMap<String, Object>>)parentMap.get(detailKey);
		}
		return null;
	}

	/**
	 * マップ値を取得します。
	 *
	 * <br>
	 * @param map マップ情報
	 * @param key 取得キー
	 * @param value 値
	 * @return マップ値を返却します。未取得の場合は初期値を返却します。
	 */
	private static String getMapValue(Map<String, String> map, String key, String value)
	{
		if (null != map && 0 != map.size())
		{
			String mapValue = map.get(key);
			if (!JFUWebCommon.isNull(mapValue))
			{
				return mapValue;
			}
		}
		return value;
	}

	/**
	 * マップ値を取得します。
	 *
	 * <br>
	 * @param map マップ情報
	 * @param key 取得キー
	 * @param index 要素番号
	 * @param value 値
	 * @return マップ値を返却します。未取得の場合は初期値を返却します。
	 */
	private static String getMapValue(Map<String, String> map, String key, int index, String value)
	{
		if (null != map && 0 != map.size())
		{
			String mapValue = map.get(key);
			if (!JFUWebCommon.isNull(mapValue))
			{
				String[] mapValues = mapValue.split(JFUStrConst.COMMA);
				if (index <= mapValues.length - 1 && !JFUWebCommon.isNull(mapValues[index]))
				{
					return mapValues[index];
				}
			}
		}
		return value;
	}
}