/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JFUWebMskmMansionPrcCC
*	ソースファイル名：JFUWebMskmMansionPrcCC.java
*	作成者			：FJ
*	日付			：2023年08月14日
*＜機能概要＞
*	WEB申込マンション料金検索処理の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v67.00      2023/08/25  FJ) 張本    【ANK-4467-00-00】FRONTIERのマンション導線巻き取りに伴うAPI変更
*   v73.00      2024/11/15  FJ) 張本    【ANK-4493-00-00】【eo定期】光配線マンションのコースアップ対応
*   v73.01      2025/01/28	FJ) 張本	【ST-2025-0000003】FRONTIERマンションの料金表不正
**********************************************************************/
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.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.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JFUMkmInfoAddUtil;
import eo.ejb.cbs.cbsmsg.EAC0251B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0711B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0711B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1921B501CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1921B501CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2371A010CBSMsg;

/**
* WEB申込マンション料金検索処理の共通コンポーネントクラスです。
 * <BR>
 * @author FJ
 */
public class JFUWebMskmMansionPrcCC extends JFUEohDnBknSearchBaseCC
{
	/** エラー情報 **/
	private static final String ERROR_INFO = "ERROR_INFO";
	/** エラーコード **/
	private static final String ERROR_CODE = "errCode";
	/** エラーメッセージ **/
	private static final String ERROR_MESSAGE = "errMessage";

	/** CCパラメータ：物件管理番号*/
	private static final String REQ_BKN_KNRI_NO = "bkn_knri_no";
	/** CCパラメータ：ネット用提供方式契約番号 */
	private static final String REQ_NET_TK_HOSHIKI_KEI_NO = "net_tk_hoshiki_kei_no";
	/** CCパラメータ：テレビ用提供方式契約番号 */
	private static final String REQ_TV_TK_HOSHIKI_KEI_NO = "tv_tk_hoshiki_kei_no";
	/** CCパラメータ：ネット用回線使用契約番号 */
	private static final String REQ_NET_KAISEN_USE_KEI_NO = "net_kaisen_use_kei_no";
	/** CCパラメータ：テレビ用回線使用契約番号 */
	private static final String REQ_TV_KAISEN_USE_KEI_NO = "tv_kaisen_use_kei_no";

	/** CCパラメータ：月額料金(eo光ネット)１００Ｍ */
	private static final String RES_NET_100M_MONTHLY_AMNT = "net_100m_monthly_amnt";
	/** CCパラメータ：月額料金(eo光ネット)１ギガ */
	private static final String RES_NET_1G_MONTHLY_AMNT = "net_1g_monthly_amnt";
	/** CCパラメータ：月額料金(eo光ネット)５ギガ */
	private static final String RES_NET_5G_MONTHLY_AMNT = "net_5g_monthly_amnt";
	/** CCパラメータ：月額料金(eo光ネット)１０ギガ */
	private static final String RES_NET_10G_MONTHLY_AMNT = "net_10g_monthly_amnt";
	/** CCパラメータ：VDSLモデムレンタル料 */
	private static final String RES_VDSL_MODEM_RENT_AMNT = "vdsl_modem_rent_amnt";

	/** CCパラメータ：インターネット・電話セット割引 */
	private static final String RES_NET_TEL_SETWARI_AMNT = "net_tel_setwari_amnt";
	/** CCパラメータ：インターネット・ＴＶセット割引 */
	private static final String RES_NET_TV_SETWARI_AMNT = "net_tv_setwari_amnt";
	/** CCパラメータ：電話・ＴＶセット割引 */
	private static final String RES_TEL_TV_SETWARI_AMNT = "tel_tv_setwari_amnt";
	/** CCパラメータ：契約事務手数料(eo光ネット／eo光電話) */
	private static final String RES_NET_TEL_KEI_JMTE_AMNT = "net_tel_kei_jmte_amnt";
	/** CCパラメータ：標準工事費(eo光ネット／eo光電話) */
	private static final String RES_NET_TEL_STDARD_KOJI_AMNT = "net_tel_stdard_koji_amnt";
	/** CCパラメータ：標準工事費(eo光テレビ) */
	private static final String RES_TV_STDARD_KOJI_AMNT = "tv_stdard_koji_amnt";

	/** CCパラメータ：月額キャンペーンリスト(eo光ネット) */
	private static final String RES_NET_MONTHLY_CAMPAIGN_LIST = "net_monthly_campaign_list";
	/** CCパラメータ：月額キャンペーンリスト(eo光テレビ) */
	private static final String RES_TV_MONTHLY_CAMPAIGN_LIST = "tv_monthly_campaign_list";
	/** CCパラメータ：初期費用キャンペーンリスト(eo光ネット) */
	private static final String RES_NET_INIT_CAMPAIGN_LIST = "net_init_campaign_list";
	/** CCパラメータ：初期費用キャンペーンリスト(eo光テレビ) */
	private static final String RES_TV_INIT_CAMPAIGN_LIST = "tv_init_campaign_list";

	/** CCパラメータ：キャンペーンコード */
	private static final String RES_CAMPAIGN_CD = "campaign_cd";
	/** CCパラメータ：キャンペーン金額 */
	private static final String RES_CAMPAIGN_AMNT = "campaign_amnt";
	/** CCパラメータ：キャンペーン適用開始基準日 */
	private static final String RES_CAMPAIGN_TSTA_YMD = "campaign_tsta_ymd";
	/** CCパラメータ：キャンペーン開始コード */
	private static final String RES_CAMPAIGN_STA_CD = "campaign_sta_cd";
	/** CCパラメータ：キャンペーン適用数 */
	private static final String RES_CAMPAIGN_APLY_CNT = "campaign_aply_cnt";

	/** マンション月額料金コース変換マップ */
	private static HashMap<String, String> mansMonthPrcMap = null;
	static
	{
		// [提供方式コード/提供方式パターン/光配線1Gのみフラグ/支払方式コード/棟内速度]
		//   → 料金コースの配列 [100M/1ギガ/5ギガ/10ギガ/VDSLモデム]
		mansMonthPrcMap = new HashMap<String, String>();
		// 001:イーサネット
		mansMonthPrcMap.put("001,,,,", "A54_PA5401,,,,");
		// 005：VDSL3
		mansMonthPrcMap.put("005,,,,", "A51_PA5101,,,,A51_PC0601");
		// 006：VDSL4
		mansMonthPrcMap.put("006,,,,", "A52_PA5201,,,,A52_PC0601");
		// 007：VDSL5
		mansMonthPrcMap.put("007,,,,", "A53_PA5301,,,,A53_PC0601");
		// 008：光配線、提供方式パターン＝50：ONU、光配線1Gのみフラグ≠1
		mansMonthPrcMap.put("008,50,*1,,", "A71_PA7101,A57_PA5701,,,");
		// 008：光配線、提供方式パターン＝50：ONU、光配線1Gのみフラグ＝1、002:個別、棟内速度＝007
		mansMonthPrcMap.put("008,50,1,002,007", ",A57_PA5701,,,");
		// 008：光配線、提供方式パターン＝50：ONU、光配線1Gのみフラグ＝1、003：全戸一括、棟内速度＝007
		mansMonthPrcMap.put("008,50,1,003,007", ",A57_PA5701,,,");
		// 008：光配線、提供方式パターン＝50：ONU、光配線1Gのみフラグ＝1、003：全戸一括、棟内速度＝008
		mansMonthPrcMap.put("008,50,1,003,008", ",,A57_PA5701,,");
		// 008：光配線、提供方式パターン＝50：ONU、光配線1Gのみフラグ＝1、003：全戸一括、棟内速度＝009
		mansMonthPrcMap.put("008,50,1,003,009", ",,,A57_PA5701,");
		// 008：光配線、提供方式パターン＝51：光コンセント、棟内速度＝008
		mansMonthPrcMap.put("008,51,,,008", ",,A57_PA5701,,");
		// 008：光配線、提供方式パターン＝51：光コンセント、棟内速度＝009
		mansMonthPrcMap.put("008,51,,,009", ",,,A57_PA5701,");
		// 008：光配線、提供方式パターン＝51：光コンセント、棟内速度≠008/009
		mansMonthPrcMap.put("008,51,,,*008/009", ",A57_PA5701,,,");
		// 008：光配線、提供方式パターン＝53：コース変更可能
		mansMonthPrcMap.put("008,53,,,", ",A57_PA5701,,A74_PA7401,");
		// 010：ギガイーサ
		mansMonthPrcMap.put("010,,,,", "A70_PA7001,A55_PA5501,,,");
	}

	/** マンションセット割変換マップ */
	private static HashMap<String, String> mansSetWribMap = null;
	static
	{
		// [提供方式コード/セット割タイプ(1:ネット＋電話,2:ネット＋テレビ,3:電話＋テレビ)]
		//   → 割引料金コースの配列 [割引サービスコード/料金コースコード/料金プランコード/割引料金の料金コース]
		mansSetWribMap = new HashMap<String, String>();
		// 光配線：セット割（ネット＋電話）
		mansSetWribMap.put("008,1", "W000M1503,A31,PA3104,A31");
		// 光配線：セット割（ネット＋テレビ）
		mansSetWribMap.put("008,2", "W000M1502,A87,PA8703,A39");
		// 光配線：セット割（電話＋テレビ）
		mansSetWribMap.put("008,3", "W000M1504,A87,PA8703,A39");
		// 光配線以外：セット割（ネット＋電話）
		mansSetWribMap.put("*008,1", "W000M0703,A31,PA3102,A31");
		// 光配線以外：セット割（ネット＋テレビ）
		mansSetWribMap.put("*008,2", "W000M0702,A87,PA8703,A39");
		// 光配線以外：セット割（電話＋テレビ）
		mansSetWribMap.put("*008,3", "W000M0704,A87,PA8703,A39");
	}

	/** キャンペーン割引変換マップ */
	private static HashMap<String, String> mansCampWribMap = null;
	static
	{
		// [キャンペーンコード＆タイプ(0:月額料金,以外:初期費用)]
		//   → 割引料金コースの配列 [割引サービスコード/料金コースコード/料金プランコード/割引料金の料金コース]
		//   ※（「＝」はネットの料金コース／プランに置換）
		mansCampWribMap = new HashMap<String, String>();
		// (19001100)ｅｏ暮らしスタート割ＭＴ＿月額△５００（税抜）
		mansCampWribMap.put("19001100_0","W40000101,=,=,=");
		// (19000600)＜集営案件＞無線ルータ利用料永年無料
		mansCampWribMap.put("19000600_0","W40000100,G02,PG0201,=");
		// (20001300)＜集営案件＞ｅｏ無線ＬＡＮ中継機利用料割引
		mansCampWribMap.put("20001300_0","W40000115,CA1,PCA101,=");
		// (13508100)ｅｏ光ＣＰ（ＳＴＢ）＿２ヵ月無料
		mansCampWribMap.put("13508100_0","W10000047,CA5,PCA501,A39");
		// (17001200)テレビｅｏ暮らしスタート割ＭＴ＿△６２００月額△５００（税抜）
		mansCampWribMap.put("17001200_0","W40000063,A87,PA8703,A39");
		// (17001200)テレビｅｏ暮らしスタート割ＭＴ＿△６２００月額△５００（税抜）
		mansCampWribMap.put("17001200_1","W40000063,A39,PA3901,A39");
		// (17008700)ｅｏ暮らしスタート割ＭＴ＿標準工事費無料
		mansCampWribMap.put("17008700_1","W40000074,=,=,=");
		// (17008700)ｅｏ暮らしスタート割ＭＴ＿標準工事費無料
		mansCampWribMap.put("17008700_2","W40000075,=,=,=");
		// (24001400)【物件限定】マンションタイプ１０ギガコース限定１年間無料キャンペーン
		mansCampWribMap.put("24001400_0","W10000225,A74,PA7401,A74");
	}

	/** マンション初期費用変換マップ */
	private static HashMap<String, String> mansShokiPrcMap = null;
	static
	{
		// 一時金支払料金番号  → 該当する提供方式パターンの配列 
		mansShokiPrcMap = new HashMap<String, String>();
		// 事務手数料:イーサ／ギガイーサ
		mansShokiPrcMap.put("210050016013", JFUStrConst.TK_HOSHIKI_PTN_ENET + JFUStrConst.COMMA + JFUStrConst.TK_HOSHIKI_PTN_GG_ENET);
		// 事務手数料:イーサ／ギガイーサ以外
		mansShokiPrcMap.put("210050016011", JFUStrConst.TK_HOSHIKI_PTN_VDSL + JFUStrConst.COMMA + JFUStrConst.TK_HOSHIKI_PTN_VDSLS 
				+ JFUStrConst.COMMA + JFUStrConst.TK_HOSHIKI_PTN_HIKARI_HAISEN);
		// 標準工事費:イーサ／ギガイーサ
		mansShokiPrcMap.put("210090176010", JFUStrConst.TK_HOSHIKI_PTN_ENET + JFUStrConst.COMMA + JFUStrConst.TK_HOSHIKI_PTN_GG_ENET);
		// 標準工事費:VDSL-S(モデムレンタル)
		mansShokiPrcMap.put("210090326010", JFUStrConst.TK_HOSHIKI_PTN_VDSLS);
		// 標準工事費:VDSL(モデムレンタル)
		mansShokiPrcMap.put("210090376010", JFUStrConst.TK_HOSHIKI_PTN_VDSL);
		// 標準工事費:光配線
		mansShokiPrcMap.put("210090576010", JFUStrConst.TK_HOSHIKI_PTN_HIKARI_HAISEN);
		// 標準工事費:テレビ
		mansShokiPrcMap.put("210080016017", JFUStrConst.EMPTY);
	}

	/** 項目キー：一時金支払料金番号 */
	private static HashMap<String, String> keyTMP_PAY_PRC = null;
	static
	{
		keyTMP_PAY_PRC = new HashMap<String, String>();
		// 事務手数料:イーサ／ギガイーサ
		keyTMP_PAY_PRC.put("210050016013", RES_NET_TEL_KEI_JMTE_AMNT);
		// 事務手数料:イーサ／ギガイーサ以外
		keyTMP_PAY_PRC.put("210050016011", RES_NET_TEL_KEI_JMTE_AMNT);
		// 標準工事費:イーサ／ギガイーサ
		keyTMP_PAY_PRC.put("210090176010", RES_NET_TEL_STDARD_KOJI_AMNT);
		// 標準工事費:VDSL-S(モデムレンタル)
		keyTMP_PAY_PRC.put("210090326010", RES_NET_TEL_STDARD_KOJI_AMNT);
		// 標準工事費:VDSL(モデムレンタル)
		keyTMP_PAY_PRC.put("210090376010", RES_NET_TEL_STDARD_KOJI_AMNT);
		// 標準工事費:光配線
		keyTMP_PAY_PRC.put("210090576010", RES_NET_TEL_STDARD_KOJI_AMNT);
		// 標準工事費:テレビ
		keyTMP_PAY_PRC.put("210080016017", RES_TV_STDARD_KOJI_AMNT);
	}

	/** 項目キー：月額料金(eo光ネット) */
	private static final String[] KEY_MONTHLY_AMNT =
			new String[] { RES_NET_100M_MONTHLY_AMNT, RES_NET_1G_MONTHLY_AMNT, RES_NET_5G_MONTHLY_AMNT, 
				RES_NET_10G_MONTHLY_AMNT, RES_VDSL_MODEM_RENT_AMNT };

	/** 項目キー：セット割 */
	private static final String[] KEY_SETWARI =
			new String[] { RES_NET_TEL_SETWARI_AMNT, RES_NET_TV_SETWARI_AMNT, RES_TEL_TV_SETWARI_AMNT };

	/** イコール(=) */
	private static final String EQUAL = "=";
	/** システムコード */
	private static final String SYS_CD_AC = "AC";
	/** 割引集計コード */
	private static final String WRIB_SHUK_CD_02 = "02";

	/** 項目ID：マンションキャンペーンコード */
	private static final String ITEM_WRIB_SVC_CD = "wrib_svc_cd";
	/** 項目ID：料金コースコード */
	private static final String ITEM_PCRS_CD = "pcrs_cd";
	/** 項目ID：料金プランコード */
	private static final String ITEM_PPLAN_CD = "pplan_cd";
	/** 項目ID：適用数 */
	private static final String ITEM_APLY_CNT = "aply_cnt";
	/** 項目ID：割引金額 */
	private static final String ITEM_WRIB_VALUE = "wrib_value";
	/** 項目ID：キャンペーン開始コード */
	private static final String ITEM_CAMPAIGN_STA_CD = "campaign_sta_cd";
	/** 項目ID：割引サービス詳細適用開始年月日 */
	private static final String ITEM_WRIB_SVC_DTL_TSTAYMD = "wrib_svc_dtl_tstaymd";

	/** eo光ネットマンションタイププラン変更基本料金一覧照会CC */
	private static final String MTPLAN_CHG_PRC_SHOKAI_CC = "JFUMTPlanChgPrcShokaiCC";
	/** シミュレーションリスト */
	private static final String JACPRCSIMULATIONLIST = "JACPrcSimulationList";
	/** シミュレーション結果リスト */
	private static final String JACPRCSIMULATIONCCMSG2LIST = "JACPrcSimulationMsg2List";
	/** 基本料金リスト */
	private static final String JP_CHG_PRC_SHOKAI_MT_CC_MSG1_LIST = "JFUMTPlanChgPrcShokaiCCMsg1List";
	/** 料金コースコード */
	private static final String PCRS_CD = "PCRS_CD";
	/** 料金サービスコード（料金プランコード） */
	private static final String PRC_SVC_CD = "PRC_SVC_CD";
	/** 料金項目コード */
	private static final String PRC_KMK_CD = "PRC_KMK_CD";
	/** 請求金額 */
	private static final String PRC = "PRC";

	/** 料金項目コード：基本料金 */
	private static final String PRC_KMK_CD_KIHON = "21001101601";
	/** 料金項目コード：VDSL接続用子機レンタル料 */
	private static final String PRC_KMK_CD_VRENT = "21003031101";

	// ■割引サービス単価一覧照会（割引サービスコード）
	/** テンプレートID 割引サービス単価一覧照会（割引サービスコード） */
	private static final String TEMP_ID_EKK0711B001 = "EKK0711B001";
	/** テンプレートID(明細) 割引サービス単価一覧照会（割引サービスコード） */
	private static final String TEMP_ID_DTL_EKK0711B001 = EKK0711B001CBSMsg.EKK0711B001CBSMSG1LIST;
	/** IN項目リスト 割引サービス単価一覧照会（割引サービスコード） */
	private static final List<String> IN_COL_LIST_EKK0711B001 = Arrays.asList(EKK0711B001CBSMsg.KEY_WRIB_SVC_CD);
	/** 関連チェックエラー項目 割引サービス単価一覧照会（割引サービスコード） */
	private static final String ERR_COL_EKK0711B001 = EKK0711B001CBSMsg.KEY_WRIB_SVC_CD_ERR;

	// ■割引サービス詳細一意照会
	/** テンプレートID 割引サービス詳細一意照会 */
	private static final String TEMP_ID_EKK2371A010 = "EKK2371A010";
	/** テンプレートID(明細) 割引サービス詳細一意照会 */
	private static final String TEMP_ID_DTL_EKK2371A010 = EKK2371A010CBSMsg.EKK2371A010CBSMSG1LIST;
	/** IN項目リスト 割引サービス詳細一意照会 */
	private static final List<String> IN_COL_LIST_EKK2371A010 = 
		Arrays.asList(EKK2371A010CBSMsg.KEY_WRIB_SVC_DTL_CD, EKK2371A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目 割引サービス詳細一意照会 */
	private static final String ERR_COL_EKK2371A010 = EKK2371A010CBSMsg.KEY_WRIB_SVC_DTL_CD_ERR;

	// ■割引料金＜料金シミュレーション＞一覧照会
	/** テンプレートID 割引料金＜料金シミュレーション＞一覧照会 */
	private static final String TEMP_ID_EAC0251B010 = "EAC0251B010";
	/** テンプレートID(明細) 割引料金＜料金シミュレーション＞一覧照会 */
	private static final String TEMP_ID_DTL_EAC0251B010 = EAC0251B010CBSMsg.EAC0251B010CBSMSG1LIST;
	/** IN項目リスト 割引料金＜料金シミュレーション＞一覧照会 */
	private static final List<String> IN_COL_LIST_EAC0251B010 = 
			Arrays.asList(EAC0251B010CBSMsg.KEY_SYS_CD, EAC0251B010CBSMsg.KEY_PRC_SVC_CD, EAC0251B010CBSMsg.KEY_WRIB_SHUK_CD, EAC0251B010CBSMsg.KEY_PCRS_CD);
	/** 関連チェックエラー項目 割引料金＜料金シミュレーション＞一覧照会 */
	private static final String ERR_COL_EAC0251B010 = EAC0251B010CBSMsg.KEY_SYS_CD_ERR;

	// ■料金シミュレーションマンション一時支払料金一覧照会
	/** テンプレートID 料金シミュレーションマンション一時支払料金一覧照会 */
	private static final String TEMP_ID_EKK1921B501 = "EKK1921B501";
	/** テンプレートID(明細) 料金シミュレーションマンション一時支払料金一覧照会 */
	private static final String TEMP_ID_DTL_EKK1921B501 = EKK1921B501CBSMsg.EKK1921B501CBSMSG1LIST;
	/** IN項目リスト 料金シミュレーションマンション一時支払料金一覧照会 */
	private static final List<String> IN_COL_LIST_EKK1921B501 = Arrays.asList(EKK1921B501CBSMsg.TK_HOSHIKI_KEI_NO);
	/** 関連チェックエラー項目 料金シミュレーションマンション一時支払料金一覧照会 */
	private static final String ERR_COL_EKK1921B501 = EKK1921B501CBSMsg.TK_HOSHIKI_KEI_NO_ERR;

	/**
	 * WEB申込マンション料金検索処理を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// ユーザデータ取得
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
		// 返却用ボディ
		Map<String, Object> bodyMap = new HashMap<String, Object>();

		// データチェック
		/* 単項目チェック */
		if (!checkUnitParam(ccMsg))
		{
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
			return param;
		}

		// 返却用マップ
		Map<String, Object> outMap = new HashMap<String, Object>();
		// マンション検索のパラメタ設定
		ccMsg.put(KEY_BKN_KNRI_NO, ccMsg.get(REQ_BKN_KNRI_NO));
		ccMsg.put(KEY_NET_TK_HOSHIKI_KEI_NO, ccMsg.get(REQ_NET_TK_HOSHIKI_KEI_NO));
		ccMsg.put(KEY_TV_TK_HOSHIKI_KEI_NO, ccMsg.get(REQ_TV_TK_HOSHIKI_KEI_NO));
		ccMsg.put(KEY_NET_KAISEN_USE_KEI_NO, ccMsg.get(REQ_NET_KAISEN_USE_KEI_NO));
		ccMsg.put(KEY_TV_KAISEN_USE_KEI_NO, ccMsg.get(REQ_TV_KAISEN_USE_KEI_NO));
		// マンション検索処理
		execMansionSearch(handle, param, ccMsg, outMap);

		List<Map<String, Object>> mansionList = (List<Map<String, Object>>)outMap.get(RES_MANSION_SEARCH_LIST);
		// マンション検索一覧リスト 
		for (Map<String, Object> mansMap : mansionList)
		{
			if ("002".equals(mansMap.get("mansion_bukken_cd")))
			{
				continue;
			}
			// ネット用提供方式契約番号
			String netTkHoshikiKeiNo = (String)mansMap.get(RES_NET_TK_HOSHIKI_KEI_NO);
			// テレビ用提供方式契約番号
			String tvTkHoshikiKeiNo = (String)mansMap.get(RES_TV_TK_HOSHIKI_KEI_NO);
			// 提供方式コード
			String tkHoshikiCd = (String)mansMap.get(RES_TK_HOSHIKI_CD);
			// 提供料金種別コード 
			String tkPrcSbtCd = (String)mansMap.get(RES_TK_PRC_SBT_CD);

			// ネット提供方式契約ありの場合
			if (!JFUBPCommon.isNull(netTkHoshikiKeiNo))
			{
				// ネット月額料金の取得
				getMansMonthPrc(handle, param, bodyMap, mansMap);
				// セット割料金の取得
				getSetWribPrc(handle, param, fixedText, bodyMap, tkHoshikiCd);
				// 一時支払料金（ネット）の取得
				getMansShokiPrc(handle, param, fixedText, bodyMap, tkHoshikiCd, tkPrcSbtCd, netTkHoshikiKeiNo);
			}

			// テレビ提供方式契約ありの場合
			if (!JFUBPCommon.isNull(tvTkHoshikiKeiNo))
			{
				// 一時支払料金（テレビ）の取得
				getMansShokiPrc(handle, param, fixedText, bodyMap, JFUStrConst.TK_HOSHIKI_TV, "", tvTkHoshikiKeiNo);
			}

			// キャンペーン割料金の取得
			getCampWribPrc(handle, param, fixedText, bodyMap, (HashMap)mansMap);

		}

		// 一度ユーザデータを削除し、再度設定する
		param.removeData(fixedText);
		param.setData(fixedText, bodyMap);

		// 正常終了
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
		param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

		return param;
	}

	/**
	 * 単項目チェック
	 * 
	 * @param ccMsg
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkUnitParam(Map<String, Object> ccMsg) throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		String itemName = null;
		String itemValue = null;

		// 物件管理番号
		itemName = REQ_BKN_KNRI_NO;
		itemValue = (String)ccMsg.get(itemName);

		// 必須チェック
		if (itemValue == null || itemValue.trim().isEmpty())
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName, itemValue));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 12))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName, itemValue));
		}

		// ネット用提供方式契約番号
		itemName = REQ_NET_TK_HOSHIKI_KEI_NO;
		itemValue = (String)ccMsg.get(itemName);

		if (itemValue == null || itemValue.trim().isEmpty())
		{
			// 必須チェックなし
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName, itemValue));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 12))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName, itemValue));
		}

		// テレビ用提供方式契約番号
		itemName = REQ_TV_TK_HOSHIKI_KEI_NO;
		itemValue = (String)ccMsg.get(itemName);

		if (itemValue == null || itemValue.trim().isEmpty())
		{
			// 必須チェックなし
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName, itemValue));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 12))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName, itemValue));
		}

		// ネット用回線使用契約番号
		itemName = REQ_NET_KAISEN_USE_KEI_NO;
		itemValue = (String)ccMsg.get(itemName);

		if (itemValue == null || itemValue.trim().isEmpty())
		{
			// 必須チェックなし
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName, itemValue));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 12))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName, itemValue));
		}

		// テレビ用回線使用契約番号
		itemName = REQ_TV_KAISEN_USE_KEI_NO;
		itemValue = (String)ccMsg.get(itemName);

		if (itemValue == null || itemValue.trim().isEmpty())
		{
			// 必須チェックなし
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName, itemValue));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 12))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName, itemValue));
		}

		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}

		return true;
	}

	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @param itemName
	 *            項目名
	 * @param itemValue
	 * 				項目値
	 * @return Map<String, String>
	 */
	private Map<String, String> getReqErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1001);
		returnMap.put(ERROR_MESSAGE, String.format("%s:%s", itemName, ""));

		return returnMap;
	}

	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * 
	 * @param itemName
	 *            項目名
	 * @param itemValue
	 * 				項目値
	 * @return Map<String, String>
	 */
	private Map<String, String> getFormErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1002);
		returnMap.put(ERROR_MESSAGE, String.format("%s:%s", itemName, itemValue));

		return returnMap;
	}

	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @param itemName
	 *            項目名
	 * @param itemValue
	 * 				項目値
	 * @return Map<String, String>
	 */
	private Map<String, String> getLenErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1003);
		returnMap.put(ERROR_MESSAGE, String.format("%s:%s", itemName, itemValue));

		return returnMap;
	}

	/**
	 * マンションの月額料金を取得する。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param bodyMap BODY用マップ
	 * @param mansMap マンション検索マップ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void getMansMonthPrc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> bodyMap, Map<String, Object> mansMap) throws Exception
	{
		// マンションID
		String mansionId = (String)mansMap.get(RES_MANSION_ID);
		// ネット用提供方式契約番号
		String netTkHoshikiKeiNo = (String)mansMap.get(RES_NET_TK_HOSHIKI_KEI_NO);
		// ネット用回線使用契約番号
		String netKaisenUseKeiNo = (String)mansMap.get(RES_NET_KAISEN_USE_KEI_NO);
		// マンション料金コース取得
		String[] mansPcrsCd = getMansPcrsCd(mansMap);

		Map<String, Object> parentMap = new HashMap<String, Object>();
		//マンションID
		parentMap.put("key_mansion_id", mansionId);
		// ＫＥＹ＿提供方式契約番号
		parentMap.put("key_tk_hoshiki_kei_no", netTkHoshikiKeiNo);
		// ＫＥＹ＿支払契約識別コード
		parentMap.put("key_pay_kei_skbt_cd", "2");
		// ＫＥＹ＿回線使用契約番号（ネット）
		parentMap.put("key_kaisen_use_kei_no", netKaisenUseKeiNo);

		param.setData(MTPLAN_CHG_PRC_SHOKAI_CC, parentMap);

		// マンション基本料金CC呼出し
		JFUMTPlanChgPrcShokaiCC mtPrcCC = new JFUMTPlanChgPrcShokaiCC();
		mtPrcCC.getResultData(handle, param, MTPLAN_CHG_PRC_SHOKAI_CC);

		HashMap resultMap = (HashMap)param.getData(MTPLAN_CHG_PRC_SHOKAI_CC);

		for (int i = 0; i < mansPcrsCd.length; i++)
		{
			if (!JFUBPCommon.isNull(mansPcrsCd[i]))
			{
				String pcrs[] = mansPcrsCd[i].split(JFUStrConst.HALF_UNDER_BAR);

				// ネットの月額料金をセット
				getMansNetPcrsMap(resultMap, bodyMap, pcrs[0], pcrs[1], KEY_MONTHLY_AMNT[i]);
			}
		}
	}

	/**
	 * マンションのネット月額料金を取得する
	 * 
	 * @param mansMap マンション検索マップ
	 * @return
	 */
	private static String[] getMansPcrsCd(Map<String, Object> mansMap)
	{
		// 提供方式コード
		String tkHoshikiCd = (String)mansMap.get(RES_TK_HOSHIKI_CD);
		// 提供方式パターンコード
		String tkHoshikiPtnCd = (String)mansMap.get(RES_TK_HOSHIKI_PATTERN_CD);
		// 光配線１Ｇのみフラグ 
		String hhs1gonlyFlg = (String)mansMap.get(RES_HHS_1GONLY_FLG);
		// 加入契約支払方式コード 
		String payHoshikiCd = (String)mansMap.get(RES_KANYU_KEI_PAY_HOSHIKI_CD);
		// 棟内速度コード
		String tonaiSpeedCd = (String)mansMap.get(RES_TONAI_SPEED_CD);

		// 月額料金コース
		return getPrcCrsCd(tkHoshikiCd, tkHoshikiPtnCd, hhs1gonlyFlg, payHoshikiCd, tonaiSpeedCd);
	}

	/**
	 * ネットの月額料金を取得する。
	 * 
	 * @param parentMap 返却用マップ
	 * @param bodyMap BODY用マップ
	 * @param netPcrsCd 料金コースコード
	 * @param netPplanCd 料金プランコード
	 * @param keyKmkNm 月額料金の項目名
	 */
	@SuppressWarnings("unchecked")
	private static void getMansNetPcrsMap(Map parentMap, Map<String, Object> bodyMap, String netPcrsCd, String netPplanCd, String keyKmkNm)
	{
		ArrayList childList = null;
		// リスト存在チェック
		if (parentMap != null && parentMap.size() > 0)
		{
			childList = (ArrayList)parentMap.get(JP_CHG_PRC_SHOKAI_MT_CC_MSG1_LIST);
			if (childList == null || childList.size() == 0)
			{
				// 存在しない場合処理を終了する
				return;
			}
		}

		// ★★★★★固定料金取得処理★★★★★
		for (int i = 0; i < childList.size(); i++)
		{
			HashMap childMap = (HashMap)childList.get(i);

			// ●固定単価
			ArrayList jACPrcSimulationList = (ArrayList)childMap.get(JACPRCSIMULATIONLIST);
			for (int n = 0; n < jACPrcSimulationList.size(); n++)
			{
				HashMap jACPrcSimulationMap = (HashMap)jACPrcSimulationList.get(n);
				// 固定金額リスト取得
				ArrayList koteiAmntList = (ArrayList)jACPrcSimulationMap.get(JACPRCSIMULATIONCCMSG2LIST);
				// 明細リスト存在チェック
				if (JFUBPCommon.isNull(koteiAmntList))
				{
					// 存在しない場合処理を終了する
					break;
				}
				for (int j = 0; j < koteiAmntList.size(); j++)
				{
					// 固定金額
					HashMap koteiAmntMap = (HashMap)koteiAmntList.get(j);

					// 料金項目コード
					String prcKmkCd = (String)koteiAmntMap.get(PRC_KMK_CD);
					// 料金コースコード
					String pcrsCd = (String)koteiAmntMap.get(PCRS_CD);
					// 料金プランコード
					String pplanCd = ((String) koteiAmntMap.get(PRC_SVC_CD)).trim();

					// 対象料金コード、料金プランコードのどちらかが異なる場合は、処理をスキップして続行
					if (!netPcrsCd.equals(pcrsCd) || !netPplanCd.equals(pplanCd))
					{
						continue;
					}

					if (PRC_KMK_CD_KIHON.equals(prcKmkCd) && netPcrsCd.equals(pcrsCd) && netPplanCd.equals(pplanCd))
					{
						bodyMap.put(keyKmkNm, (String)koteiAmntMap.get(PRC));
						break;
					}
					if (PRC_KMK_CD_VRENT.equals(prcKmkCd) && netPcrsCd.equals(pcrsCd) && netPplanCd.equals(pplanCd))
					{
						bodyMap.put(keyKmkNm, (String)koteiAmntMap.get(PRC));
						break;
					}
				}

				// 基本プランの料金が取得できなかった場合は0円を取得する。
				String price = (String)bodyMap.get(keyKmkNm);

				if (JFUBPCommon.isNull(price))
				{
					bodyMap.put(keyKmkNm, JFUStrConst.S_ZERO);
				}
			}
		}
	}

	/**
	 * 提供方式パターンコードから料金コースを取得
	 * @param  tkHoshikiCd 提供方式コード
	 * @param  tkHoshikiPtnCd 提供方式パターンコード
	 * @param  hhs1gonlyFlg 光配線１Ｇのみフラグ
	 * @param  payHoshikiCd 加入契約支払方式コード
	 * @param  tonaiSpeedCd 棟内速度コード
	 * @return 料金コースの配列（100M/1ギガ/5ギガ/10ギガ/VDSLモデム）
	 */
	private static String[] getPrcCrsCd(String tkHoshikiCd, String tkHoshikiPtnCd, String hhs1gonlyFlg, String payHoshikiCd, String tonaiSpeedCd)
	{
		for (String keyMansPrc : mansMonthPrcMap.keySet())
		{
			String jkns[] = keyMansPrc.split(JFUStrConst.COMMA);
			String vals[] = new String[] { tkHoshikiCd, tkHoshikiPtnCd, hhs1gonlyFlg, payHoshikiCd, tonaiSpeedCd };

			if (judgeKeyVal(jkns, vals))
			{
				return mansMonthPrcMap.get(keyMansPrc).split(JFUStrConst.COMMA);
			}
		}
		return new String[]{};
	}

	/**
	 * 提供方式コードから割引の料金コースを取得
	 * 
	 * @param  tkHoshikiCd 提供方式コード
	 * @param  type セット割タイプ
	 * @return 料金コースの配列（割引サービスコード/割引サービス料金コースコード/割引料金プランコード/割引料金コースコード）
	 */
	private static String[] getSetWriPrcCrsCd(String tkHoshikiCd, String type)
	{
		for (String keyMansWrib : mansSetWribMap.keySet())
		{
			String jkns[] = keyMansWrib.split(JFUStrConst.COMMA);
			String vals[] = new String[] { tkHoshikiCd, type };

			if (judgeKeyVal(jkns, vals))
			{
				return mansSetWribMap.get(keyMansWrib).split(JFUStrConst.COMMA);
			}
		}
		return null;
	}

	/**
	 * 条件と値が合致するかを判定する
	 * 
	 * @param jkns 
	 * @param vals
	 * @param judgeFlg
	 * @return
	 */
	private static boolean judgeKeyVal(String[] jkns, String[] vals)
	{
		for (int i = 0; i < jkns.length; i++)
		{
			String jkn = jkns[i];
			String val = vals[i];

			if (!JFUBPCommon.isNull(jkn) && jkn.startsWith(JFUStrConst.ASTERISK_HALF))
			{
				String notJkn = jkn.replace(JFUStrConst.ASTERISK_HALF, "");
				List<String> notJkns = Arrays.asList(notJkn.split(JFUStrConst.SLASH));
				if (notJkns.contains(val))
				{
					return false;
				}
			}
			else if (!JFUBPCommon.isNull(jkn) && !jkn.equals(val))
			{
				return false;
			}
		}
		return true;
	}

	/**
	 * マンション初期費用の取得処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param bodyMap BODY用マップ
	 * @param tkHoshikiCd 提供方式コード
	 * @param tkHoshikiKeiNo 提供方式契約番号
	 * @throws Throwable 例外
	 */
	@SuppressWarnings("unchecked")
	private static void getMansShokiPrc(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, Map<String, Object> bodyMap, String tkHoshikiCd, String tkPrcSbtCd, String tkHoshikiKeiNo)
			throws Exception
	{
		// ●上りマッピング(EKK1921B501：料金シミュレーションマンション一時支払料金一覧照会)
		// 上りマップ
		HashMap setMap = new HashMap();
		// 提供方式契約番号
		setMap.put(EKK1921B501CBSMsg.TK_HOSHIKI_KEI_NO, tkHoshikiKeiNo);
		// 機能コード
		setMap.put(EKK1921B501CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// リクエストパラメータに設定
		param.setData(fixedText, setMap);
		// 検索なしエラー回避
		JFUBPCommon.ignoreSearchError(param, fixedText);

		// ●料金シミュレーションマンション一時支払料金一覧照会サービスIF実行
		JFUBPCommon.executeSC(handle, param, fixedText, TEMP_ID_EKK1921B501, TEMP_ID_DTL_EKK1921B501, IN_COL_LIST_EKK1921B501, ERR_COL_EKK1921B501);
		// ●サービスIF結果取得
		ArrayList EKK1921B501List = getSifResultList(param, fixedText, TEMP_ID_DTL_EKK1921B501);
		// ●下りマッピング
		for (int j = 0; j < EKK1921B501List.size(); j++)
		{
			// 取得結果マップ
			HashMap tmpPayPrcMap = (HashMap)EKK1921B501List.get(j);
			String tmpPayPrcNo = (String)tmpPayPrcMap.get(EKK1921B501CBSMsg1List.TMP_PAY_PRC_NO);
			String tmpPayPrcAmnt = (String)tmpPayPrcMap.get(EKK1921B501CBSMsg1List.TMP_PAY_PRC_AMNT);

			if (mansShokiPrcMap.containsKey(tmpPayPrcNo))
			{
				List<String> jkn = Arrays.asList(mansShokiPrcMap.get(tmpPayPrcNo).split(JFUStrConst.COMMA));
				// 提供方式パターンに一致する一時支払料金番号を取得
				if (jkn.contains(JFUMkmInfoAddUtil.getFuTeikyoHoshikiPtnCd(tkHoshikiCd, tkPrcSbtCd)))
				{
					// 一時金／標準工事費に結果マップを追加
					bodyMap.put(keyTMP_PAY_PRC.get(tmpPayPrcNo), tmpPayPrcAmnt);
				}
			}
		}
	}

	/**
	 * キャンペーン割料金を取得する。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param bodyMap BODY用マップ
	 * @param mansMap マンション検索マップ
	 * @throws Throwable 例外
	 */
	@SuppressWarnings("unchecked")
	private static void getCampWribPrc(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, Map<String, Object> bodyMap, HashMap mansMap)
			throws Exception
	{

		String CAMP_REQ_LIST_KEY[] = {RES_NET_MANS_CAMPAIGN_LIST, RES_TV_MANS_CAMPAIGN_LIST};
		String CAMP_RES_LIST_KEY1[] = {RES_NET_MONTHLY_CAMPAIGN_LIST, RES_TV_MONTHLY_CAMPAIGN_LIST};
		String CAMP_RES_LIST_KEY2[] = {RES_NET_INIT_CAMPAIGN_LIST, RES_TV_INIT_CAMPAIGN_LIST};
		String CAMP_RES_CD_KEY[] = {RES_NET_MANS_CAMPAIGN_CD, RES_TV_MANS_CAMPAIGN_CD};
		String STDARD_KOJIHI_KEY[] = {RES_NET_TEL_STDARD_KOJI_AMNT, RES_TV_STDARD_KOJI_AMNT};

		// マンション料金コース取得
		String[] netPcrsCd = getMansPcrsCd(mansMap);
		// ネットの料金コースを格納
		String repNetPcrs[] = { "", "", "", "" };
		for (int i = 0; i < netPcrsCd.length; i++)
		{
			if (!JFUBPCommon.isNull(netPcrsCd[i]))
			{
				String pcrs[] = netPcrsCd[i].split(JFUStrConst.HALF_UNDER_BAR);
				repNetPcrs[1] = pcrs[0]; // 料金コースコード
				repNetPcrs[2] = pcrs[1]; // 料金プランコード
				repNetPcrs[3] = pcrs[0]; // 料金コースコード
				break;
			}
		}

		for (int i = 0; i < CAMP_REQ_LIST_KEY.length; i++)
		{
			// 月額料金キャンペーンリスト
			List<Map<String, Object>> monthCampList = new ArrayList<Map<String, Object>>();
			// 初期費用キャンペーンリスト
			List<Map<String, Object>> shokiCampList = new ArrayList<Map<String, Object>>();

			// マンション検索結果のキャンペーンリストを取得
			List<Map<String, Object>> campList = (List<Map<String, Object>>)mansMap.get(CAMP_REQ_LIST_KEY[i]);

			if (campList == null)
			{
				continue;
			}

			for (Map<String, Object> map : campList)
			{
				// マンション検索結果のキャンペーンコードを取得
				String campCd = (String)map.get(CAMP_RES_CD_KEY[i]);

				for (String keyMansWrib : mansCampWribMap.keySet())
				{
					// 割引サービス情報リスト
					ArrayList wribSvcInfoList = new ArrayList();

					String key[] = keyMansWrib.split(JFUStrConst.HALF_UNDER_BAR);
					if (campCd.equals(key[0]))
					{
						// 割引サービス情報の料金コース取得
						String[] wribSvcCd = mansCampWribMap.get(keyMansWrib).split(JFUStrConst.COMMA);
						for (int k = 0; k < wribSvcCd.length; k++)
						{
							// 「＝」の場合はネットの料金コースに置換え
							if (EQUAL.equals(wribSvcCd[k]))
							{
								wribSvcCd[k] = repNetPcrs[k];
							}
						}

						HashMap wribSvcInfoMap = new HashMap();
						// 割引サービスコード
						wribSvcInfoMap.put(ITEM_WRIB_SVC_CD, wribSvcCd[0]);
						// 料金コースコード
						wribSvcInfoMap.put(ITEM_PCRS_CD, wribSvcCd[1]);
						// 料金プランコード
						wribSvcInfoMap.put(ITEM_PPLAN_CD, wribSvcCd[2]);
						// 対象の割引情報を設定
						wribSvcInfoList.add(wribSvcInfoMap);

						// 割引料金を取得
						List<Map> wribList = (ArrayList)getWribPrcList(handle, param, fixedText, wribSvcInfoList, wribSvcCd[3]);
						for (Map wribMap : wribList)
						{
							HashMap campMap = new HashMap();
							campMap.put(RES_CAMPAIGN_CD, campCd);
							campMap.put(RES_CAMPAIGN_STA_CD, wribMap.get(ITEM_CAMPAIGN_STA_CD));
							campMap.put(RES_CAMPAIGN_TSTA_YMD, wribMap.get(ITEM_WRIB_SVC_DTL_TSTAYMD));
							campMap.put(RES_CAMPAIGN_APLY_CNT, wribMap.get(ITEM_APLY_CNT));
							// 月額料金キャンペーン
							if (JFUStrConst.S_ZERO.equals(key[1]))
							{
								campMap.put(RES_CAMPAIGN_AMNT, wribMap.get(ITEM_WRIB_VALUE));
								monthCampList.add(campMap);
							}
							// 初期費用キャンペーン
							else
							{
								campMap.put(RES_CAMPAIGN_AMNT, getMinusPrice((String)bodyMap.get(STDARD_KOJIHI_KEY[i])));
								shokiCampList.add(campMap);
							}
						}
					}
				}
			}

			bodyMap.put(CAMP_RES_LIST_KEY1[i], monthCampList);
			bodyMap.put(CAMP_RES_LIST_KEY2[i], shokiCampList);
		}

	}

	/**
	 * セット割料金を取得する。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param bodyMap BODY用マップ
	 * @param tkHoshikiCd 提供方式コード
	 * @throws Throwable 例外
	 */
	@SuppressWarnings("unchecked")
	private static void getSetWribPrc(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, Map<String, Object> bodyMap, String tkHoshikiCd)
			throws Exception
	{

		for (int i = 0; i < KEY_SETWARI.length; i++)
		{
			// 割引サービス情報
			String[] wribSvcCd = getSetWriPrcCrsCd(tkHoshikiCd, String.valueOf(i + 1));
			if (!JFUBPCommon.isNull(wribSvcCd))
			{
				// 割引サービス情報リスト
				ArrayList wribSvcInfoList = new ArrayList();

				HashMap wribSvcInfoMap = new HashMap();
				// 料金コースコード
				wribSvcInfoMap.put(ITEM_WRIB_SVC_CD, wribSvcCd[0]);
				// 料金コースコード
				wribSvcInfoMap.put(ITEM_PCRS_CD, wribSvcCd[1]);
				// 料金プランコード
				wribSvcInfoMap.put(ITEM_PPLAN_CD, wribSvcCd[2]);
				// 対象の割引情報を設定
				wribSvcInfoList.add(wribSvcInfoMap);
				// 割引料金を取得
				List<Map> wribList = getWribPrcList(handle, param, fixedText, wribSvcInfoList, wribSvcCd[3]);
				for (Map wribMap : wribList)
				{
					bodyMap.put(KEY_SETWARI[i], wribMap.get(ITEM_WRIB_VALUE));
				}
			}
		}

	}

	/**
	 * 割引料金を取得する。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param wribSvcInfoList
	 * @return
	 * @throws RequestParameterException
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private static List<Map> getWribPrcList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			List wribSvcInfoList, String keyPcrsCd) throws RequestParameterException, Exception
	{
		List<Map> wribPrcList = new ArrayList<Map>();
		// 割引サービス単価情報リスト
		List<Map> wribSvcTnkInfoList = new ArrayList<Map>();

		// ★割引サービス単価情報取得
		for (int i = 0; i < wribSvcInfoList.size(); i++)
		{
			// 割引サービス情報取得
			HashMap wribSvcInfoMap = (HashMap)wribSvcInfoList.get(i);

			if(wribSvcInfoMap == null || wribSvcInfoMap.size() == 0)
			{
				continue;
			}

			// 割引サービスコード
			String wribSvcCd = (String)wribSvcInfoMap.get(ITEM_WRIB_SVC_CD);

			// ●割引サービス詳細情報取得
			HashMap wribSvcDtlMap = getWribKikan(handle, param, fixedText, wribSvcCd, 
					(String)wribSvcInfoMap.get(ITEM_PCRS_CD), (String)wribSvcInfoMap.get(ITEM_PPLAN_CD));

			// 割引サービス単価情報に設定
			wribSvcTnkInfoList.add(wribSvcDtlMap);
		}

		// ★割引金額取得
		String bfWribSvcCd = JFUStrConst.EMPTY;
		String bfPplanCd = JFUStrConst.EMPTY;
		for (int i = 0; i < wribSvcTnkInfoList.size(); i++)
		{
			// 割引サービス単価情報取得
			HashMap wribSvcTnkInfoMap = (HashMap)wribSvcTnkInfoList.get(i);

			if(wribSvcTnkInfoMap == null || wribSvcTnkInfoMap.size() == 0)
			{
				continue;
			}

			// 割引サービス単価番号
			String wribSvcTnkNo = (String)wribSvcTnkInfoMap.get(EKK0711B001CBSMsg1List.WRIB_SVC_TANKA_NO);
			// 割引サービスコード
			String wribSvcCd = (String)wribSvcTnkInfoMap.get(EKK0711B001CBSMsg1List.WRIB_SVC_CD);
			// 料金プランコード
			String pplanCd = (String)wribSvcTnkInfoMap.get(ITEM_PPLAN_CD);
			// 適用数(キャンペーン期間)
			String aplyCnt = campaignAplyCntNullToN((String)wribSvcTnkInfoMap.get(ITEM_APLY_CNT));
			// キャンペーン開始コード 
			String staCd = (String)wribSvcTnkInfoMap.get(ITEM_CAMPAIGN_STA_CD);
			// 適用開始年月日
			String tstaYmd = (String)wribSvcTnkInfoMap.get(ITEM_WRIB_SVC_DTL_TSTAYMD);

			if(JFUBPCommon.isNull(wribSvcTnkNo))
			{
				continue;
			}

			// 割引サービス同チェック
			if(bfWribSvcCd.equals(wribSvcCd) && bfPplanCd.equals(pplanCd))
			{
				// 同番号の場合、次の処理へ
				continue;
			}
			else
			{
				// 異なる場合、比較対象変数に格納する
				bfWribSvcCd = wribSvcCd;
				bfPplanCd = pplanCd;
			}

			// ●上りマッピング(EAC0251B010：割引料金＜料金シミュレーション＞一覧照会)
			HashMap setMap = new HashMap();
			// ＫＥＹ＿システムコード
			setMap.put(EAC0251B010CBSMsg.KEY_SYS_CD, SYS_CD_AC);
			// ＫＥＹ＿料金サービスコード
			setMap.put(EAC0251B010CBSMsg.KEY_PRC_SVC_CD, wribSvcTnkNo);
			// ＫＥＹ＿割引集計コード
			setMap.put(EAC0251B010CBSMsg.KEY_WRIB_SHUK_CD, WRIB_SHUK_CD_02);
			// ＫＥＹ＿料金コースコード
			if (!JFUBPCommon.isNull(keyPcrsCd))
			{
				setMap.put(EAC0251B010CBSMsg.KEY_PCRS_CD, keyPcrsCd);
			}
			// 機能コード
			setMap.put(EAC0251B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
			// リクエストパラメータに設定
			param.setData(fixedText, setMap);
			// 検索なしエラー回避
			JFUBPCommon.ignoreSearchError(param, fixedText);

			// ●割引料金＜料金シミュレーション＞一覧照会サービスIF実行
			JFUBPCommon.executeSC(handle, param, fixedText, TEMP_ID_EAC0251B010, TEMP_ID_DTL_EAC0251B010, IN_COL_LIST_EAC0251B010, ERR_COL_EAC0251B010);

			// ●サービスIF結果取得
			ArrayList eAC0251B010List = getSifResultList(param, fixedText, TEMP_ID_DTL_EAC0251B010);

			for (int j = 0; j < eAC0251B010List.size(); j++)
			{
				HashMap eAC0251B010Map = (HashMap)eAC0251B010List.get(j);
				if(eAC0251B010Map == null || eAC0251B010Map.size() == 0)
				{
					continue;
				}

				// 適用数(キャンペーン期間)
				eAC0251B010Map.put(ITEM_APLY_CNT, aplyCnt);
				// キャンペーン開始コード 
				eAC0251B010Map.put(ITEM_CAMPAIGN_STA_CD, staCd);
				// 適用開始年月日
				eAC0251B010Map.put(ITEM_WRIB_SVC_DTL_TSTAYMD, tstaYmd);
				// 料金プラン
				eAC0251B010Map.put(ITEM_PPLAN_CD, pplanCd);

				wribPrcList.add(eAC0251B010Map);
			}
		}

		return wribPrcList;
	}

	/**
	 * 割引適用期間取得処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param paramMap マップ
	 * @param wribSvcCd 割引サービスコード
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @return 結果
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private static HashMap getWribKikan(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			String wribSvcCd, String pcrsCd, String pplanCd) throws Exception
	{
		// 結果
		HashMap result = null;

		// ●上りマッピング(EKK0711B001：割引サービス単価一覧照会（割引サービスコード）)
		HashMap setMap = new HashMap();
		// ＫＥＹ＿割引サービスコード
		setMap.put(EKK0711B001CBSMsg.KEY_WRIB_SVC_CD, wribSvcCd);
		// 機能コード
		setMap.put(EKK0711B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// リクエストパラメータに設定
		param.setData(fixedText, setMap);
		// 検索なしエラー回避
		JFUBPCommon.ignoreSearchError(param, fixedText);

		// ●割引サービス単価一覧照会（割引サービスコード）サービスIF実行
		JFUBPCommon.executeSC(handle, param, fixedText, TEMP_ID_EKK0711B001, TEMP_ID_DTL_EKK0711B001, IN_COL_LIST_EKK0711B001, ERR_COL_EKK0711B001);

		// ●サービスIF結果取得
		ArrayList eKK0711B001List = getSifResultList(param, fixedText, TEMP_ID_DTL_EKK0711B001);

		for (int i = 0; i < eKK0711B001List.size(); i++)
		{
			HashMap eKK0711B001Map = (HashMap)eKK0711B001List.get(i);
			if(eKK0711B001Map == null || eKK0711B001Map.size() == 0)
			{
				continue;
			}

			// 割引サービス詳細コード
			String wribSvcDtlCd = (String)eKK0711B001Map.get(EKK0711B001CBSMsg1List.WRIB_SVC_DTL_CD);
			// 料金コースコード
			String eKK0711B001PcrsCd = (String)eKK0711B001Map.get(EKK0711B001CBSMsg1List.PCRS_CD);
			// 料金プランコード
			String eKK0711B001PplanCd = (String)eKK0711B001Map.get(EKK0711B001CBSMsg1List.PPLAN_CD);
			// 割引サービス単価番号
			String wribSvcTankaNo = (String)eKK0711B001Map.get(EKK0711B001CBSMsg1List.WRIB_SVC_TANKA_NO);

			if(!(eKK0711B001PcrsCd.equals(pcrsCd) && eKK0711B001PplanCd.equals(pplanCd)))
			{
				continue;
			}

			// ●上りマッピング(EKK2371A010：割引サービス詳細一意照会)
			setMap = new HashMap();
			// ＫＥＹ＿割引サービス詳細コード
			setMap.put(EKK2371A010CBSMsg.KEY_WRIB_SVC_DTL_CD, wribSvcDtlCd);
			// ＫＥＹ＿予約適用年月日
			setMap.put(EKK2371A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
			// 機能コード
			setMap.put(EKK2371A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);
			// リクエストパラメータに設定
			param.setData(fixedText, setMap);
			// 検索なしエラー回避
			JFUBPCommon.ignoreSearchError(param, fixedText);

			// ●割引サービス詳細一意照会サービスIF実行
			JFUBPCommon.executeSC(handle, param, fixedText, TEMP_ID_EKK2371A010, TEMP_ID_DTL_EKK2371A010, IN_COL_LIST_EKK2371A010, ERR_COL_EKK2371A010);

			// ●サービスIF結果取得
			ArrayList eKK2371A010List = getSifResultList(param, fixedText, TEMP_ID_DTL_EKK2371A010);

			for (int j = 0; j < eKK2371A010List.size(); j++)
			{
				HashMap eKK2371A010Map = (HashMap)eKK2371A010List.get(j);
				if(eKK2371A010Map != null && eKK2371A010Map.size() > 0)
				{
					// 料金コース
					eKK2371A010Map.put(ITEM_PCRS_CD, pcrsCd);
					// 料金プラン
					eKK2371A010Map.put(ITEM_PPLAN_CD, pplanCd);
					// 割引サービス単価番号
					eKK2371A010Map.put(EKK0711B001CBSMsg1List.WRIB_SVC_TANKA_NO, wribSvcTankaNo);
					// 適用数(キャンペーン期間)
					result = eKK2371A010Map;
					break;
				}
			}

			// 値が設定されていれば終了
			if(result != null && result.size() > 0)
			{
				break;
			}
		}

		return result;
	}


	/**
	 * 金額をマイナスする
	 * 
	 * @param price
	 * @return
	 */
	private static String getMinusPrice(String price)
	{
		if (!JFUBPCommon.isNull(price) && !JFUStrConst.S_ZERO.equals(price))
		{
			price = JFUStrConst.HALF_HAIHUN + price;
		}
		return price;
	}

	/**
	 * サービスIF結果リスト取得処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param listNm リスト名
	 * @return 結果
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private static ArrayList getSifResultList(IRequestParameterReadWrite param, String fixedText, String listNm) throws Exception
	{
		ArrayList resultList = null;

		if((boolean)((HashMap)param.getData(fixedText)).containsKey(listNm))
		{
			resultList = (ArrayList)((HashMap)param.getData(fixedText)).get(listNm);
		}

		return resultList != null ? resultList : new ArrayList();
	}

	/**
	 * キャンペーン適用数が未設定の場合、無期限を表す"N"を設定。
	 * @param campaignAplyCnt キャンペーン適用数
	 * @return campaignAplyCnt キャンペーン適用数
	 */
	private static String campaignAplyCntNullToN(String campaignAplyCnt)
	{
		if(campaignAplyCnt == null){
			return "N";
		}
		return campaignAplyCnt;
	}
}