/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUCheckMansionInfo
*   ソースファイル名：JFUCheckMansionInfo.java
*   作成者          ：富士通
*   日付            ：2012年09月21日
*＜機能概要＞
*   マンション情報整合性チェック部品です。
*   想定する呼出元は下記の通りです。
*   ・フロント受付のマンション検索コモンコンポーネント部品
*   ・顧客契約のマンションレプリカ取込バッチ
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2012/09/21   FJ)岩元     新規作成
*   v5.00       2012/12/13   FJ)大村     「ANK-1392-00-00」棟別マンション対応
*   v5.01       2013/08/15   FJ)岡井     【仕様変更】非表示マンション・メゾン対応
*  v40.00       2018/09/07   FJ）張本    【ANK-3412-00-00】５ギガ・１０ギガコース導入対応
*  v53.00       2021/04/01   FJ)張本     【ANK-3989-00-00】マンション光コンセント方式への5G・10Gコース追加
*
**********************************************************************/
package eo.common.util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import eo.common.constant.JFUStrConst;

/**
 * マンション情報整合性チェック部品です。
 * <br>
 * @author 富士通
 */
public class JFUCheckMansionInfo
{

	// -------------------------------------------------------------
	// 外部参照可能定数
	// -------------------------------------------------------------
	/** マンション物件コード */
	public static final String MANSION_BUKKEN_CD = "mansion_bukken_cd";
	/** 提供方式コード */
	public static final String TK_HOSHIKI_CD = "tk_hoshiki_cd";
	/** CATID */
	public static final String CATID = "catid";
	/** 光テレビ提供状況コード */
	public static final String HIKARI_TV_TK_JOKYO_CD = "hikari_tv_tk_jokyo_cd";
	/** 加入契約申込条件コード */
	public static final String KNYKEI_MSKM_JOKEN_CD = "knykei_mskm_joken_cd";
	/** ネット加入契約申込条件コード */
	public static final String NET_KNYKEI_MSKM_JOKEN_CD = "net_knykei_mskm_joken_cd";
	/** テレビ加入契約申込条件コード */
	public static final String TV_KNYKEI_MSKM_JOKEN_CD = "tv_knykei_mskm_joken_cd";
	/** 棟内速度コード */
	public static final String TONAI_SPEED_CD = "tonai_speed_cd";
	/** 提供料金種別コード */
	public static final String TK_PRC_SBT_CD = "tk_prc_sbt_cd";
	/** 加入契約ネット10G申込可否 */
	public static final String KNYKEI_NET_10G_MSKM_KH = "knykei_net_10g_mskm_kh";
	/** 加入契約ネット1G申込可否 */
	public static final String KNYKEI_NET_1G_MSKM_KH = "knykei_net_1g_mskm_kh";
	/** 加入契約ネット200M申込可否 */
	public static final String KNYKEI_NET_200M_MSKM_KH = "knykei_net_200m_mskm_kh";
	/** 加入契約ネット100M申込可否 */
	public static final String KNYKEI_NET_100M_MSKM_KH = "knykei_net_100m_mskm_kh";
	/** 光電話提供コード */
	public static final String HIKARI_TEL_TK_CD = "hikari_tel_tk_cd";
	/** メゾン光テレビ提供コード */
	public static final String MAISON_HIKARI_TV_TK_CD = "maison_hikari_tv_tk_cd";
	/** 提供方式パターンコード */
	public static final String TK_HOSHIKI_PATTERN_CD = "tk_hoshiki_pattern_cd";
	/** 提供方式コードチェックエラー */
	public static final String TK_HOSHIKI_CD_ERR = "tk_hoshiki_cd_err";
	/** マンションテレビチェックエラー */
	public static final String MANSION_TV_ERR = "mansion_tv_err";
	/** 加入契約申込条件コードチェックエラー */
	public static final String KNYKEI_MSKM_JOKEN_CD_ERR = "knykei_mskm_joken_cd_err";
	/** 棟内速度コードチェックエラー */
	public static final String TONAI_SPEED_CD_ERR = "tonai_speed_cd_err";

	// -------------------------------------------------------------
	// 内部専用定数
	// -------------------------------------------------------------
	/** 起動元コード：01(オンライン) */
	private static final String KIDO_CD_ON = "01";
	/** 起動元コード：02(バッチ) */
	private static final String KIDO_CD_BAT = "02";
	/** チェック結果：0(正常) */
	private static final String CHECK_RESULT_0 = "0";
	/** チェック結果：1(異常系その1) */
	private static final String CHECK_RESULT_1 = "1";
	/** チェック結果：2(異常系その2) */
	private static final String CHECK_RESULT_2 = "2";
	/** チェック結果：3(異常系その3) */
	private static final String CHECK_RESULT_3 = "3";
	/** チェック結果：4(異常系その4) */
	private static final String CHECK_RESULT_4 = "4";

	/** 判定用マップ生成コード：1 */
	private static final int MODE_1 = 1;
	/** 判定用マップ生成コード：2 */
	private static final int MODE_2 = 2;
	/** 判定用マップ生成コード：3 */
	private static final int MODE_3 = 3;
	/** 判定用マップ生成コード：4 */
	private static final int MODE_4 = 4;
	/** 判定用マップ生成コード：5 */
	private static final int MODE_5 = 5;
	/** 判定用マップ生成コード：6 */
	private static final int MODE_6 = 6;

	/** 加入契約申込条件コード 無効マンション */
	public static final String INVALID_MANS = "19";
	/** 加入契約申込条件コード 無効メゾン */
	public static final String INVALID_MZ = "29";

	/**
	 * 初期化処理
	 * <br>
	 * @param mansionInfo マンション情報
	 * @param checkInfoResult チェック結果情報
	 * @return retMap 初期化してINPUTを設定しなおしたマップ
	 */
	private static HashMap<String, String> init(HashMap<String, String> mansionInfo, HashMap<String, String> checkInfoResult)
	{
		// 戻り値のマップ
		HashMap<String, String> retMap = new HashMap<String, String>();

		// -------------------------------------------------------------
		// チェック結果情報の初期化
		// -------------------------------------------------------------
		// 提供方式コードチェックエラー
		checkInfoResult.put(JFUCheckMansionInfo.TK_HOSHIKI_CD_ERR, "0");
		// マンションテレビチェックエラー
		checkInfoResult.put(JFUCheckMansionInfo.MANSION_TV_ERR, "0");
		// 加入契約申込条件コードチェックエラー
		checkInfoResult.put(JFUCheckMansionInfo.KNYKEI_MSKM_JOKEN_CD_ERR, "0");
		// 棟内速度コードチェックエラー
		checkInfoResult.put(JFUCheckMansionInfo.TONAI_SPEED_CD_ERR, "0");

		// -------------------------------------------------------------
		// 共通項目
		// -------------------------------------------------------------

		// マンション物件コード
		retMap.put(MANSION_BUKKEN_CD, "");
		// CATID
		retMap.put(CATID, "");
		// 加入契約申込条件コード
		retMap.put(KNYKEI_MSKM_JOKEN_CD, "");

		// -------------------------------
		// マンション項目
		// -------------------------------
		// 光テレビ提供状況コード
		retMap.put(HIKARI_TV_TK_JOKYO_CD, "");
		// 提供方式コード
		retMap.put(TK_HOSHIKI_CD, "");
		// 棟内速度コード
		retMap.put(TONAI_SPEED_CD, "");
		// 提供料金種別コード
		retMap.put(TK_PRC_SBT_CD, "");

		// -------------------------------
		// メゾン項目
		// -------------------------------
		// 加入契約ネット10G申込可否
		retMap.put(KNYKEI_NET_10G_MSKM_KH, "");
		// 加入契約ネット1G申込可否
		retMap.put(KNYKEI_NET_1G_MSKM_KH, "");
		// 加入契約ネット200M申込可否
		retMap.put(KNYKEI_NET_200M_MSKM_KH, "");
		// 加入契約ネット100M申込可否
		retMap.put(KNYKEI_NET_100M_MSKM_KH, "");
		// 光電話提供コード
		retMap.put(HIKARI_TEL_TK_CD, "");
		// メゾン光テレビ提供コード
		retMap.put(MAISON_HIKARI_TV_TK_CD, "");

		// INPUT項目で上書きする
		Iterator<Map.Entry<String, String>> it = mansionInfo.entrySet().iterator();
		while (it.hasNext())
		{
			Map.Entry<String, String> entry = (Map.Entry<String, String>)it.next();
			String key = (String)entry.getKey();
			String value = (String)entry.getValue();
			if (value != null)
			{
				retMap.put(key, value);
			}
		}

		return retMap;

	}

	/**
	 * マンション情報整合性チェック実行
	 * <br>
	 * @param kido_cd 起動元コード
	 * @param mansionInfo マンション情報
	 * @return checkInfoResult チェック結果情報
	 */
	public static HashMap<String, String> executeCheckMansionInfo(String kido_cd, HashMap<String, String> mansionInfo)
	{
		// チェック結果情報
		HashMap<String, String> checkInfoResult = new HashMap<String, String>();

		// -------------------------------------------------------------
		// 初期化
		// -------------------------------------------------------------
		HashMap<String, String> initMansionInfo = init(mansionInfo, checkInfoResult);

		// -------------------------------------------------------------
		// (1)マンション物件コード取得
		// -------------------------------------------------------------
		String mansion_bukken_cd = initMansionInfo.get(MANSION_BUKKEN_CD);

		// -------------------------------------------------------------
		// (2)提供方式コードチェック処理
		// -------------------------------------------------------------

		// (a)起動元コードが"01"オンライン(フロント)の場合
		if (KIDO_CD_ON.equals(kido_cd))
		{
			// @上記(1)で取得したマンション物件コードが"001"(マンション)の場合
			if (JFUStrConst.MANSION_BUKKEN_CD_MF.equals(mansion_bukken_cd))
			{
				// マンション情報(mansionInfo)より、提供方式コードを取得して提供方式コードチェック(tkHoshikiCdCheck)メソッドを呼び出す。
				String tk_hoshiki_cd = initMansionInfo.get(TK_HOSHIKI_CD); // 提供方式コード
				checkInfoResult.put(TK_HOSHIKI_CD_ERR, tkHoshikiCdCheck(tk_hoshiki_cd));
			}
			// A上記(1)で取得したマンション物件コードが"002"(メゾン)の場合
			else if (JFUStrConst.MANSION_BUKKEN_CD_MZ.equals(mansion_bukken_cd))
			{
				// 提供方式コードチェックは行わず下記の通り、チェック結果情報(checkInfoResult)に設定する
				checkInfoResult.put(TK_HOSHIKI_CD_ERR, CHECK_RESULT_0); // 正常
			}

		}
		// (b)起動元コードが"02"バッチ(バックヤード)の場合
		else if (KIDO_CD_BAT.equals(kido_cd))
		{
			// 提供方式コードチェックは行わず下記の通り、チェック結果情報(checkInfoResult)に設定する
			checkInfoResult.put(TK_HOSHIKI_CD_ERR, CHECK_RESULT_0); // 正常
		}

		// -------------------------------------------------------------
		// (3)マンションテレビチェック処理
		// -------------------------------------------------------------

		// (a)上記(1)で取得したマンション物件コードが"001"(マンション)の場合
		if (JFUStrConst.MANSION_BUKKEN_CD_MF.equals(mansion_bukken_cd))
		{
			// マンション情報(mansionInfo)より、CATIDと光テレビ提供状況コードを取得してマンションテレビチェック(mansionTvCheck)メソッドを呼び出す。
			String catid = initMansionInfo.get(CATID); // CATID
			String hikari_tv_tk_jokyo_cd = initMansionInfo.get(HIKARI_TV_TK_JOKYO_CD); // 光テレビ提供状況コード

			// マンションテレビチェック(mansionTvCheck)の戻り値を下記の通り、チェック結果情報(checkInfoResult)に設定する。
			checkInfoResult.put(MANSION_TV_ERR, mansionTvCheck(catid, hikari_tv_tk_jokyo_cd));
		}
		// (b)上記(1)で取得したマンション物件コードが"002"(メゾン)の場合
		else if (JFUStrConst.MANSION_BUKKEN_CD_MZ.equals(mansion_bukken_cd))
		{
			// マンションテレビチェックは行わず下記の通り、チェック結果情報(checkInfoResult)に設定する。
			checkInfoResult.put(MANSION_TV_ERR, CHECK_RESULT_0);
		}

		// -------------------------------------------------------------
		// (4)加入契約申込条件コードチェック
		// -------------------------------------------------------------

		// 起動元コード(kido_cd)とマンション情報(mansionInfo)を引数として、加入契約申込条件コードチェック(knykeiMskmJokenCdCheck)メソッドを呼び出す。
		checkInfoResult.put(KNYKEI_MSKM_JOKEN_CD_ERR, knykeiMskmJokenCdCheck(kido_cd, initMansionInfo));

		// -------------------------------------------------------------
		// (5)棟内速度コードチェック
		// -------------------------------------------------------------

		// (a)上記(1)で取得したマンション物件コードが"001"(マンション)の場合
		if (JFUStrConst.MANSION_BUKKEN_CD_MF.equals(mansion_bukken_cd))
		{
			// マンション情報(mansionInfo)より、加入契約申込条件コード(knykei_mskm_joken_cd)、提供方式コード(tk_hoshiki_cd)、
			// 棟内速度コード（tonai_speed_cd)、提供料金種別コード(tk_prc_sbt_cd)を取得する。
			String knykei_mskm_joken_cd = initMansionInfo.get(KNYKEI_MSKM_JOKEN_CD);
			String tk_hoshiki_cd = initMansionInfo.get(TK_HOSHIKI_CD);
			String tonai_speed_cd = initMansionInfo.get(TONAI_SPEED_CD);
			String tk_prc_sbt_cd = initMansionInfo.get(TK_PRC_SBT_CD);

			// @加入契約申込条件コードが"11"(Web可単独),"12"(Web可併設),"13"(全戸一括)のいずれかに該当する場合
			HashMap<String, String> mansionWebOkMap = getKnykeiMskmJokenCdMap(MODE_1);
			if (mansionWebOkMap.containsKey(knykei_mskm_joken_cd))
			{
				// 棟内速度チェック(tonaiSpeedCheck)を行い、戻り値を下記の通りチェック結果情報(checkInfoResult)に設定する。
				checkInfoResult.put(TONAI_SPEED_CD_ERR, tonaiSpeedCheck(tk_hoshiki_cd, tonai_speed_cd, tk_prc_sbt_cd));
			}
			// A上記@のコードのいずれにも該当しない場合
			else
			{
				// 棟内速度チェックは行わず下記の通り、チェック結果情報(checkInfoResult)に設定する。
				checkInfoResult.put(TONAI_SPEED_CD_ERR, CHECK_RESULT_0);
			}

		}
		// (b)上記(1)で取得したマンション物件コードが"002"(メゾン)の場合
		else if (JFUStrConst.MANSION_BUKKEN_CD_MZ.equals(mansion_bukken_cd))
		{
			// 棟内速度チェックは行わず下記の通り、チェック結果情報(checkInfoResult)に設定する。
			checkInfoResult.put(TONAI_SPEED_CD_ERR, CHECK_RESULT_0);
		}

		// -------------------------------------------------------------
		// (6)戻り値の設定
		// -------------------------------------------------------------

		// チェック結果情報(checkInfoResult)を戻り値として設定し、処理を終了とする。
		return checkInfoResult;

	}

	/**
	 * 提供方式コードチェック
	 * <br>
	 * @param tk_hoshiki_cd 提供方式コード
	 * @return checkResult チェック結果
	 */
	private static String tkHoshikiCdCheck(String tk_hoshiki_cd)
	{
		String checkResult = "";

		// 提供方式コードが001,004,005,006,007,008,010,011のいずれかに該当するか判定を行う。
		HashMap<String, String> tkHoshikiCdMap = getTkHoshikiCdMap(MODE_1);

		// (1)上記提供方式コードのいずれかに一致した場合
		if (tkHoshikiCdMap.containsKey(tk_hoshiki_cd))
		{
			// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
			checkResult = CHECK_RESULT_0;
		}

		// (2)上記提供方式コードのいずれにも一致しない場合
		else
		{
			// チェック結果(checkResult)に"1"(異常)を設定して処理を終了する。
			checkResult = CHECK_RESULT_1;
		}

		// 戻り値
		return checkResult;
	}

	/**
	 * マンションテレビチェック
	 * <br>
	 * @param catid CATID
	 * @param hikari_tv_tk_jokyo_cd 光テレビ提供状況コード
	 * @return checkResult チェック結果
	 */
	private static String mansionTvCheck(String catid, String hikari_tv_tk_jokyo_cd)
	{
		String checkResult = "";

		// (1)CATIDが設定されている場合
		if (!isBlank(catid))
		{
			// (a)光テレビ提供状況コードが、"0"(サービス未提供),"1"(ネット併設),"2"(テレビ単独提供),"3"(テレビ単独提供WEB不可)のいずれかに該当する場合
			HashMap<String, String> hikariTvTkJokyoCdMap = getHikariTvTkJokyoCdMap(MODE_1);

			if (hikariTvTkJokyoCdMap.containsKey(hikari_tv_tk_jokyo_cd))
			{
				// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
				checkResult = CHECK_RESULT_0;
			}
			// (b)上記(a)のいずれにも該当しない場合
			else
			{
				// チェック結果(checkResult)に"1"(異常(CATID設定有))を設定して処理を終了する。
				checkResult = CHECK_RESULT_1;
			}

			//「ANK-1392-00-00」棟別マンション対応 >>>
			//光テレビ提供状況コード：テレビ単独提供Web不可の場合は、資料請求とするため、 
			//チェック結果(checkResult)に"1"(異常(CATID設定有))を設定 ...既存不具合と思われる
			if (JFUStrConst.HIKARI_TV_TK_JOKYO_CD_TV_TNDK_WEB_HK.equals(hikari_tv_tk_jokyo_cd))
			{
				// チェック結果(checkResult)に"1"(異常(CATID設定有))を設定して処理を終了する。
				checkResult = CHECK_RESULT_1;
			}
			//「ANK-1392-00-00」棟別マンション対応 <<<
		}
		// (2)CATIDが設定されていない場合
		else
		{
			// (a)光テレビ提供状況コードが、"2"(テレビ単独提供),"3"(テレビ単独提供WEB不可)のいずれかに該当する場合
			HashMap<String, String> hikariTvTkJokyoCdMap = getHikariTvTkJokyoCdMap(MODE_2);
			if (hikariTvTkJokyoCdMap.containsKey(hikari_tv_tk_jokyo_cd))
			{
				// チェック結果(checkResult)に"2"(異常(CATID設定無))を設定して処理を終了する。
				checkResult = CHECK_RESULT_2;
			}
			// (b)上記(a)のいずれにも該当しない場合
			else
			{
				// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
				checkResult = CHECK_RESULT_0;
			}
		}

		// 戻り値
		return checkResult;
	}

	/**
	 * 加入契約申込条件コードチェック
	 * <br>
	 * @param kido_cd 起動元コード
	 * @param mansionInfo マンション情報
	 * @return checkResult チェック結果
	 */
	private static String knykeiMskmJokenCdCheck(String kido_cd, HashMap<String, String> mansionInfo)
	{
		String checkResult = "";
		// (1)マンション情報より、マンション物件コード(mansion_bukken_cd)を取得する
		String mansion_bukken_cd = mansionInfo.get(MANSION_BUKKEN_CD);

		// (2)上記(1)で取得したマンション物件コードが"001"(マンション)の場合
		if (JFUStrConst.MANSION_BUKKEN_CD_MF.equals(mansion_bukken_cd))
		{
			// (a)マンション情報より、光テレビ提供状況コード(hikari_tv_tk_jokyo_cd)を取得する
			String hikari_tv_tk_jokyo_cd = mansionInfo.get(HIKARI_TV_TK_JOKYO_CD);

			// (b)上記(a)で取得した光テレビ提供状況コードが"2"(テレビ単独提供),"3"(テレビ単独提供WEB不可)のいずれにも該当しない場合
			HashMap<String, String> hikariTvTkJokyoCdMap = getHikariTvTkJokyoCdMap(MODE_2);
			if (!hikariTvTkJokyoCdMap.containsKey(hikari_tv_tk_jokyo_cd))
			{
				// マンション情報より、加入契約申込条件コード(knykei_mskm_joken_cd)を取得し、10,11,12,13,14のいずれかに該当するか判定を行う。
				String knykei_mskm_joken_cd = mansionInfo.get(KNYKEI_MSKM_JOKEN_CD);
				String net_knykei_mskm_joken_cd = mansionInfo.get(NET_KNYKEI_MSKM_JOKEN_CD);
				String tv_knykei_mskm_joken_cd = mansionInfo.get(TV_KNYKEI_MSKM_JOKEN_CD);

				HashMap<String, String> knykeiMskmJokenCdMap = getKnykeiMskmJokenCdMap(MODE_2);
				if (knykeiMskmJokenCdMap.containsKey(knykei_mskm_joken_cd))
				{
					// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
					checkResult = CHECK_RESULT_0;
				}
				else if(INVALID_MANS.equals(knykei_mskm_joken_cd))
				{
					if((INVALID_MANS.equals(net_knykei_mskm_joken_cd) || "".equals(net_knykei_mskm_joken_cd)) 
							&& (INVALID_MANS.equals(tv_knykei_mskm_joken_cd) || "".equals(tv_knykei_mskm_joken_cd)))
					{
						// 2013.08.14 無効マンション設定がされている場合
						checkResult = CHECK_RESULT_4;
					}
					else
					{
						// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
						checkResult = CHECK_RESULT_0;
					}
				}
				else
				{
					// チェック結果(checkResult)に"1"(異常(マンション))を設定して処理を終了する。
					checkResult = CHECK_RESULT_1;
				}
			}
			// (a)で取得した光テレビ提供状況コードが(b)の条件に該当しなかった場合
			else
			{
				// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
				checkResult = CHECK_RESULT_0;
			}
		}
		// (3)上記(1)で取得したマンション物件コードが"002"(メゾン)の場合
		else if (JFUStrConst.MANSION_BUKKEN_CD_MZ.equals(mansion_bukken_cd))
		{
			// (a)マンション情報より、加入契約申込条件コード(knykei_mskm_joken_cd)を取得し、20,21,22のいずれかに該当するか判定を行う。
			String knykei_mskm_joken_cd = mansionInfo.get(KNYKEI_MSKM_JOKEN_CD);
			String net_knykei_mskm_joken_cd = mansionInfo.get(NET_KNYKEI_MSKM_JOKEN_CD);
			String tv_knykei_mskm_joken_cd = mansionInfo.get(TV_KNYKEI_MSKM_JOKEN_CD);

			HashMap<String, String> knykeiMskmJokenCdMap = getKnykeiMskmJokenCdMap(MODE_3);

			// @上記加入契約申込条件コードにいずれかが一致する場合
			if (knykeiMskmJokenCdMap.containsKey(knykei_mskm_joken_cd))
			{
				// チェック結果(checkResult)に"0"(正常)を設定して後続の処理を行う。
				checkResult = CHECK_RESULT_0;
			}
			else if(INVALID_MZ.equals(knykei_mskm_joken_cd))
			{
				if((INVALID_MZ.equals(net_knykei_mskm_joken_cd) || "".equals(net_knykei_mskm_joken_cd)) 
						&& (INVALID_MZ.equals(tv_knykei_mskm_joken_cd) || "".equals(tv_knykei_mskm_joken_cd)))
				{
					// 2013.08.15 無効メゾン設定がされている場合
					checkResult = CHECK_RESULT_4;
					return checkResult;
				}
				else
				{
					// チェック結果(checkResult)に"0"(正常)を設定して後続の処理を行う。
					checkResult = CHECK_RESULT_0;
				}
			}
			// A上記加入契約申込条件コードにいずれも一致しない場合
			else
			{
				// チェック結果(checkResult)に"2"(異常(メゾン))を設定して処理を終了する。
				checkResult = CHECK_RESULT_2;
				return checkResult;
			}

			// (b)上記(a)で取得した加入契約申込条件コードが、"21"(資料請求)または"22"(導入済み)の場合
			knykeiMskmJokenCdMap = getKnykeiMskmJokenCdMap(MODE_4);
			if (knykeiMskmJokenCdMap.containsKey(knykei_mskm_joken_cd))
			{
				// マンション情報より、CATID(catid),加入契約ネット1G申込可否(knykei_net_1g_mskm_kh),加入契約ネット200M申込可否(knykei_net_200m_mskm_kh),
				// 加入契約ネット100M申込可否(knykei_net_100m_mskm_kh),メゾン光テレビ提供コード(maison_hikari_tv_tk_cd),
				// 光電話提供コード(hikari_tel_tk_cd)を取得する。
				String catid = mansionInfo.get(CATID);
				String knykei_net_10g_mskm_kh = mansionInfo.get(KNYKEI_NET_10G_MSKM_KH);
				String knykei_net_1g_mskm_kh = mansionInfo.get(KNYKEI_NET_1G_MSKM_KH);
				String knykei_net_200m_mskm_kh = mansionInfo.get(KNYKEI_NET_200M_MSKM_KH);
				String knykei_net_100m_mskm_kh = mansionInfo.get(KNYKEI_NET_100M_MSKM_KH);
				String maison_hikari_tv_tk_cd = mansionInfo.get(MAISON_HIKARI_TV_TK_CD);
				String hikari_tel_tk_cd = mansionInfo.get(HIKARI_TEL_TK_CD);

				// チェック対象の加入契約ネット申込可否
				HashMap<String, String> checkMskmKhMap = new HashMap<String, String>();

				// 設定されているものだけKEYとしてマッピング
				if (!isBlank(knykei_net_10g_mskm_kh))
				{
					checkMskmKhMap.put(knykei_net_10g_mskm_kh, "加入契約ネット10G申込可否");
				}
				if (!isBlank(knykei_net_1g_mskm_kh))
				{
					checkMskmKhMap.put(knykei_net_1g_mskm_kh, "加入契約ネット1G申込可否");
				}
				if (!isBlank(knykei_net_200m_mskm_kh))
				{
					checkMskmKhMap.put(knykei_net_200m_mskm_kh, "加入契約ネット200M申込可否");
				}
				if (!isBlank(knykei_net_100m_mskm_kh))
				{
					checkMskmKhMap.put(knykei_net_100m_mskm_kh, "加入契約ネット100M申込可否");
				}

				// ***********************************************
				// メゾン申込可否チェック(サブロジック)を実行
				// ***********************************************
				boolean subCheck = maisonMskmKhCheck(kido_cd, checkMskmKhMap, hikari_tel_tk_cd, maison_hikari_tv_tk_cd, catid);

				// 申込可否チェックの結果trueの場合
				if (subCheck)
				{
					// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
					checkResult = CHECK_RESULT_0;
				}
				// 申込可否チェックの結果falseの場合
				else
				{
					// チェック結果(checkResult)に"3"(異常(メゾン-サービス提供状況))を設定して処理を終了する。
					checkResult = CHECK_RESULT_3;
				}

			}
		}

		return checkResult;
	}

	/**
	 * メゾン申込可否チェック
	 * ※加入契約申込条件コードチェックのサブロジック
	 * <br>
	 * @param kido_cd 起動元コード
	 * @param checkMskmKhMap ネット申込可否マップ
	 * @param hikari_tel_tk_cd 光電話提供コード
	 * @param maison_hikari_tv_tk_cd メゾン光テレビ提供コード
	 * @param catid CATID
	 * @return result チェック結果
	 */
	private static boolean maisonMskmKhCheck(String kido_cd, HashMap<String, String> checkMskmKhMap, String hikari_tel_tk_cd,
			String maison_hikari_tv_tk_cd, String catid)
	{
		boolean result = false;
		// 起動元コードがオンライン(フロント)の場合
		if (KIDO_CD_ON.equals(kido_cd))
		{
			// CATIDが設定されている場合
			if (!isBlank(catid) && !"0".equals(maison_hikari_tv_tk_cd.trim()))
			{
				// ネット3項目と光電話の計4項目のいずれかが申込める、かつ光テレビが申込めるか判定
				if (JFUStrConst.CD01261_10.equals(maison_hikari_tv_tk_cd) && (JFUStrConst.CD01221_001.equals(hikari_tel_tk_cd)
						|| checkMskmKhMap.containsKey(JFUStrConst.CD00003_1)))
				{
					result = true;
				}
			}
			// CATIDが設定されてない場合
			else
			{
				// ネット3項目・光電話の計4項目のいずれかが申込めるか判定
				if (JFUStrConst.CD01221_001.equals(hikari_tel_tk_cd) || checkMskmKhMap.containsKey(JFUStrConst.CD00003_1))
				{
					result = true;
				}
			}
		}
		// 起動元コードがバッチ(バックヤード)の場合
		else if (KIDO_CD_BAT.equals(kido_cd))
		{
			// CATIDが設定されている場合
			if (!isBlank(catid))
			{
				// 光テレビが申込めるか判定
				if (JFUStrConst.CD01261_10.equals(maison_hikari_tv_tk_cd))
				{
					result = true;
				}
			}
			// CATIDが設定されてない場合
			else
			{
				// ネット3項目・光電話の計4項目のいずれかが申込めるか判定
				if (JFUStrConst.CD01221_001.equals(hikari_tel_tk_cd) || checkMskmKhMap.containsKey(JFUStrConst.CD00003_1))
				{
					result = true;
				}
			}
		}
		return result;
	}

	/**
	 * 棟内速度コードチェック
	 * <br>
	 * @param tk_hoshiki_cd 提供方式コード
	 * @param tonai_speed_cd 棟内速度コード
	 * @param tk_prc_sbt_cd 提供料金種別コード
	 * @return checkResult チェック結果
	 */
	private static String tonaiSpeedCheck(String tk_hoshiki_cd, String tonai_speed_cd, String tk_prc_sbt_cd)
	{
		String checkResult = "";

		// 判定用-提供方式コードマップ
		HashMap<String, String> tkHoshikiCdMap = null;
		// 判定用-棟内速度コードマップ
		HashMap<String, String> tonaiSpeedCdMap = null;

		// 提供方式コード：004(VDSL2),005(VDSL3),006(VDSL4),007(VDSL5)の場合
		tkHoshikiCdMap = getTkHoshikiCdMap(MODE_2);
		if (tkHoshikiCdMap.containsKey(tk_hoshiki_cd))
		{
			// 提供料金種別コードが001(旧VDSL-S),002(VDSL-S)の場合
			HashMap<String, String> tkPrcSbtCdMap = getTkPrcSbtCdMap(MODE_1);
			if (tkPrcSbtCdMap.containsKey(tk_prc_sbt_cd))
			{
				// 棟内速度コード 006(100M/100M)の場合
				tonaiSpeedCdMap = getTonaiSpeedCd(MODE_3);
				if (tonaiSpeedCdMap.containsKey(tonai_speed_cd))
				{
					// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
					checkResult = CHECK_RESULT_0;
				}
				// (3)提供料金種別コードがVDSL-Sを示している場合に、棟内速度コードで申込可能とならなかった場合
				else
				{
					// チェック結果(checkResult)に"2"(異常(VDSL-S))を設定して処理を終了する。
					checkResult = CHECK_RESULT_2;
				}
			}
			// 提供料金種別コードがVDSL-Sではない場合
			else
			{
				tonaiSpeedCdMap = getTonaiSpeedCd(MODE_1);
				if (tonaiSpeedCdMap.containsKey(tonai_speed_cd))
				{
					// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
					checkResult = CHECK_RESULT_0;
				}
				else
				{
					// チェック結果(checkResult)に"1"(異常(棟内速度コード))を設定して処理を終了する。
					checkResult = CHECK_RESULT_1;
				}
			}
		}

		// 提供方式コード：001(イーサ)の場合
		tkHoshikiCdMap = getTkHoshikiCdMap(MODE_3);
		if (tkHoshikiCdMap.containsKey(tk_hoshiki_cd))
		{
			// 棟内速度コード 006(100M/100M)の場合
			tonaiSpeedCdMap = getTonaiSpeedCd(MODE_3);
			if (tonaiSpeedCdMap.containsKey(tonai_speed_cd))
			{
				// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
				checkResult = CHECK_RESULT_0;
			}
			// 棟内速度コード 006(100M/100M)でない場合
			else
			{
				// チェック結果(checkResult)に"1"(異常(棟内速度コード))を設定して処理を終了する。
				checkResult = CHECK_RESULT_1;
			}
		}

		// 010(ギガイーサ)の場合
		tkHoshikiCdMap = getTkHoshikiCdMap(MODE_4);
		if (tkHoshikiCdMap.containsKey(tk_hoshiki_cd))
		{
			// 棟内速度コード 006(100M/100M),007(1G/1G)の場合
			tonaiSpeedCdMap = getTonaiSpeedCd(MODE_2);
			if (tonaiSpeedCdMap.containsKey(tonai_speed_cd))
			{
				// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
				checkResult = CHECK_RESULT_0;
			}
			// 棟内速度コード 006(100M/100M),007(1G/1G)でない場合
			else
			{
				// チェック結果(checkResult)に"1"(異常(棟内速度コード))を設定して処理を終了する。
				checkResult = CHECK_RESULT_1;
			}
		}

		// 008(光配線)の場合
		tkHoshikiCdMap = getTkHoshikiCdMap(MODE_6);
		if (tkHoshikiCdMap.containsKey(tk_hoshiki_cd))
		{
			// 棟内速度コード 006(100M/100M),007(1G/1G),008(5G/5G),009(10G/10G)の場合
			tonaiSpeedCdMap = getTonaiSpeedCd(MODE_4);
			if (tonaiSpeedCdMap.containsKey(tonai_speed_cd))
			{
				// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
				checkResult = CHECK_RESULT_0;
			}
			// 棟内速度コード 006(100M/100M),007(1G/1G),008(5G/5G),009(10G/10G)でない場合
			else
			{
				// チェック結果(checkResult)に"1"(異常(棟内速度コード))を設定して処理を終了する。
				checkResult = CHECK_RESULT_1;
			}
		}

		// ネット系すべてに属さない場合
		tkHoshikiCdMap = getTkHoshikiCdMap(MODE_5);
		if (!tkHoshikiCdMap.containsKey(tk_hoshiki_cd))
		{
			// チェック結果(checkResult)に"0"(正常)を設定して処理を終了する。
			checkResult = CHECK_RESULT_0;
		}

		// 戻り値
		return checkResult;
	}

	/**
	 * 判定用に使用する加入契約申込条件コードのマップを生成します
	 * <br>
	 * @param mode 動作モード(1:WEB可マンション一式 2:マンション一式 3:メゾン一式 4:メゾン資料請求と導入済みのみ)
	 * @return knykeiMskmJokenCdMap 加入契約申込条件コードマップ
	 */
	private static HashMap<String, String> getKnykeiMskmJokenCdMap(int mode)
	{
		// 加入契約申込条件コードマップ
		HashMap<String, String> knykeiMskmJokenCdMap = new HashMap<String, String>();

		switch (mode)
		{
			// 
			case MODE_1:
				// Web可マンション一式
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_11, "Web可（単独）");
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_12, "Web可（並行）");
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_13, "全戸一括");

				break;

			case MODE_2:
				// マンション一式
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_10, "資料請求");
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_11, "Web可（単独）");
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_12, "Web可（並行）");
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_13, "全戸一括");
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_14, "導入予定");

				break;

			case MODE_3:

				// メゾン一式
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_20, "導入予定");
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_21, "資料請求");
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_22, "導入済み");

				break;

			case MODE_4:

				// メゾン資料請求と導入済みのみ
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_21, "資料請求");
				knykeiMskmJokenCdMap.put(JFUStrConst.CD01260_22, "導入済み");

				break;

			default:

				break;

		}

		return knykeiMskmJokenCdMap;
	}

	/**
	 * 判定用に使用する提供方式コードのマップを生成します
	 * <br>
	 * @param mode 動作モード(1:フロント想定全て 2:VDSL系 3:イーサのみ 4:光配線とギガイーサ 5:ネット系すべて
	 * @return tkHoshikiCdMap 提供方式コードマップ
	 */
	private static HashMap<String, String> getTkHoshikiCdMap(int mode)
	{
		// 加入契約申込条件コードマップ
		HashMap<String, String> tkHoshikiCdMap = new HashMap<String, String>();

		switch (mode)
		{
			case MODE_1:
				// フロントが想定する全て
				tkHoshikiCdMap.put(JFUStrConst.CD00590_001, "イーサネット");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_004, "VDSL2");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_005, "VDSL3");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_006, "VDSL4");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_007, "VDSL5");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_008, "光配線");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_010, "ギガイーサネット");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_011, "光テレビ");
				break;

			case MODE_2:
				// VDSL系のみ
				tkHoshikiCdMap.put(JFUStrConst.CD00590_004, "VDSL2");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_005, "VDSL3");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_006, "VDSL4");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_007, "VDSL5");
				break;

			case MODE_3:
				// イーサのみ
				tkHoshikiCdMap.put(JFUStrConst.CD00590_001, "イーサネット");
				break;

			case MODE_4:
				// ギガイーサ
				tkHoshikiCdMap.put(JFUStrConst.CD00590_010, "ギガイーサネット");
				break;

			case MODE_6:
				// 光配線
				tkHoshikiCdMap.put(JFUStrConst.CD00590_008, "光配線");
				break;

			case MODE_5:
				// ネット系すべて
				tkHoshikiCdMap.put(JFUStrConst.CD00590_001, "イーサネット");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_004, "VDSL2");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_005, "VDSL3");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_006, "VDSL4");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_007, "VDSL5");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_008, "光配線");
				tkHoshikiCdMap.put(JFUStrConst.CD00590_010, "ギガイーサネット");
				break;

			default:
				break;

		}

		return tkHoshikiCdMap;
	}

	/**
	 * 判定用に使用する光テレビ提供状況コードのマップを生成します
	 * <br>
	 * @param mode 動作モード(1:全項目 2:単独提供のみ)
	 * @return hikariTvTkJokyoCdMap 光テレビ提供状況コードマップ
	 */
	private static HashMap<String, String> getHikariTvTkJokyoCdMap(int mode)
	{
		// TODO 光テレビ提供状況コードのコード定義が無い為、画面で利用している定数値を利用(値は同一)

		// 光テレビ提供状況コードマップ
		HashMap<String, String> hikariTvTkJokyoCdMap = new HashMap<String, String>();

		switch (mode)
		{
			case MODE_1:
				// 全項目
				hikariTvTkJokyoCdMap.put(JFUStrConst.HIKARI_TV_TK_JOKYO_CD_MITK, "サービス未提供");
				hikariTvTkJokyoCdMap.put(JFUStrConst.HIKARI_TV_TK_JOKYO_CD_NET_HIST, "ネット併設");
				hikariTvTkJokyoCdMap.put(JFUStrConst.HIKARI_TV_TK_JOKYO_CD_TV_TNDK, "テレビ単独提供");
				hikariTvTkJokyoCdMap.put(JFUStrConst.HIKARI_TV_TK_JOKYO_CD_TV_TNDK_WEB_HK, "テレビ単独提供Web不可");
				break;

			case MODE_2:
				// 単独提供のみ
				hikariTvTkJokyoCdMap.put(JFUStrConst.HIKARI_TV_TK_JOKYO_CD_TV_TNDK, "テレビ単独提供");
				hikariTvTkJokyoCdMap.put(JFUStrConst.HIKARI_TV_TK_JOKYO_CD_TV_TNDK_WEB_HK, "テレビ単独提供Web不可");
				break;

			default:
				break;

		}

		return hikariTvTkJokyoCdMap;
	}

	/**
	 * 判定用に使用する提供料金種別コードのマップを生成します
	 * <br>
	 * @param mode 動作モード(1:旧VDSL-SとVDSL-S)
	 * @return tkPrcSbtCdMap 提供料金種別コードマップ
	 */
	private static HashMap<String, String> getTkPrcSbtCdMap(int mode)
	{
		// 提供料金種別コードマップ
		HashMap<String, String> tkPrcSbtCdMap = new HashMap<String, String>();

		switch (mode)
		{
			case MODE_1:
				tkPrcSbtCdMap.put(JFUStrConst.CD01209_001, "旧VDSL-S方式");
				tkPrcSbtCdMap.put(JFUStrConst.CD01209_002, "VDSL-S方式");

				break;

			default:
				break;

		}
		return tkPrcSbtCdMap;
	}

	/**
	 * 判定用に使用する棟内速度コードのマップを生成します
	 * <br>
	 * @param mode 動作モード(1:001,002,006 2:006,007 3:006)
	 * @return tonaiSpeedCdMap 棟内速度コードマップ
	 */
	private static HashMap<String, String> getTonaiSpeedCd(int mode)
	{
		// 棟内速度コードマップ
		HashMap<String, String> tonaiSpeedCdMap = new HashMap<String, String>();

		switch (mode)
		{
			case MODE_1:
				// 100M/100Mまで(001,002,006)
				tonaiSpeedCdMap.put(JFUStrConst.CD01214_001, "35M/100M");
				tonaiSpeedCdMap.put(JFUStrConst.CD01214_002, "30M/70M");
				tonaiSpeedCdMap.put(JFUStrConst.CD01214_006, "100M/100M");
				break;

			case MODE_2:
				// 100M/100Mと1G/1G(006,007)
				tonaiSpeedCdMap.put(JFUStrConst.CD01214_006, "100M/100M");
				tonaiSpeedCdMap.put(JFUStrConst.CD01214_007, "1G/1G");
				break;

			case MODE_3:
				// 100M/100Mのみ(006)
				tonaiSpeedCdMap.put(JFUStrConst.CD01214_006, "100M/100M");
				break;

			case MODE_4:
				// 100M/100Mと1G/1Gと5G/5Gと10G/10G(006,007,008,009)
				tonaiSpeedCdMap.put(JFUStrConst.CD01214_006, "100M/100M");
				tonaiSpeedCdMap.put(JFUStrConst.CD01214_007, "1G/1G");
				tonaiSpeedCdMap.put(JFUStrConst.CD01214_008, "5G/5G");
				tonaiSpeedCdMap.put(JFUStrConst.CD01214_009, "10G/10G");
				break;

			default:
				break;

		}

		return tonaiSpeedCdMap;
	}

	/**
	 * 値が設定されているか判断する
	 * <br>
	 * @param obj 設定値を確認するオブジェクト
	 * @return ret 設定されていない場合true 設定されている場合false
	 */
	private static boolean isBlank(Object obj)
	{
		boolean ret = false;
		if (obj instanceof String)
		{
			// String型の場合
			if (JFUStrConst.EMPTY.equals(obj))
			{
				ret = true;
			}
		}

		return ret;
	}
}
