/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      :eo顧客基幹システム
*   モジュール名    :JFUCheckTvMskmAvailable
*   ソースファイル名:JFUCheckTvMskmAvailable.java
*   作成者          :富士通
*   日付            :2013年05月10日
*＜機能概要＞
*   テレビ関連の申し込み可否チェック処理
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/05/10   FJ）文元    新規作成
*   v74.00      2024/12/18   FJ）美濃原 【ANK-4592-00-00】テレビ新コース（スカパー用）導入対応
*
**********************************************************************/
package eo.web.webview.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
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;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 * テレビ関連の申し込み可否チェック処理部品です。
 * <br>
 * @author 富士通
 */
public class JFUCheckTvMskmAvailable
{
	/** 機器提供サービス契約一覧照会（ｅｏ光テレビ情報取得）明細 */
	private static final String EKK0341B509CBSMSG1LIST = "EKK0341B509CBSMsg1List";

	/** 機器提供サービス契約番号 */
	public static final String KKTK_SVC_KEI_NO = "kktk_svc_kei_no";
	/** 機器製造番号 */
	public static final String KIKI_SEIZO_NO = "kiki_seizo_no";
	/** 機器提供サービスコード */
	public static final String KKTK_SVC_CD = "kktk_svc_cd";
	/** 機器提供サービス契約ステータス */
	public static final String KKTK_SVC_KEI_STAT = "kktk_svc_kei_stat";
	/** サービス契約内訳番号 */
	public static final String SVC_KEI_UCWK_NO = "svc_kei_ucwk_no";
	/** サービス契約内訳ステータス */
	public static final String SVC_KEI_UCWK_STAT = "svc_kei_ucwk_stat";
	/** 次月開始オプションチャンネル有無 */
	private static final String RSV_CHANNEL_NEXT = "rsv_channel_next";
	/** ＳＴＢ変更予約有無 */
	private static final String RSV_STAT_STB = "rsv_stat_stb";
	/** コース変更予約有無 */
	private static final String RSV_STAT_CORSE = "rsv_stat_corse";
	/** ＢＳパススルー予約有無（回線） */
	private static final String TOTAL_RSV_STAT_BS = "total_rsv_stat_bs";
	/** ＳＴＢ追加変更予約有無（サービス） */
	private static final String TOTAL_RSV_STAT_STB = "total_rsv_stat_stb";
	/** コース変更予約有無（サービス及び内訳） */
	private static final String TOTAL_RSV_STAT_CORSE = "total_rsv_stat_corse";
	/** カレントＳＴＢ機器情報*/
	private static final String CUR_STB_KIKI_INFO = "CUR_STB_KIKI_INFO";


	/** 定義取得パス */
	private static final String PATH_TV_MSKM_CHK = "DISPSETTING/SETTING[@screenId='%1%']/DISPCTL[@groupid='TV_MSKM_CHK']";
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";
	/** キー値 */
	private static final String ID_001 = "001";
	/** 置き換え文字列1 */
	private static final String RE_1 = "%1%";

	/** ZERO */
	private static final String ZERO = "0";
	/** 同日を含む／含まないの指定フラグ("1":含む) */
	private static final String DOJITSU_HUKUMU = "1";

	/** 処理結果 */
	private static final String RTN_RESULT = "RTN_RESULT";
	/** 処理結果 OK */
	private static final String RTN_RESULT_OK = "OK";
	/** サービス契約内訳番号 */
	private static final String RTN_SVC_KEI_UCWK_NO = "RTN_SVC_KEI_UCWK_NO";
	/** サービス契約 料金コースコード*/
	private static final String RTN_SVC_KEI_PCRSCD = "RTN_SVC_KEI_PCRSCD";
	/** サービス契約内訳 料金コースコード*/
	private static final String RTN_SVC_KEI_UCWK_PCRSCD = "RTN_SVC_KEI_UCWK_PCRSCD";

	/**
	 * テレビ関連の申し込み有無チェック処理
	 * <br>
	 * @param bl 部品呼び元のビジネスロジック 
	 * @param screenId 部品呼び元の画面ID
	 * @param kikiMap EKK0341B509_機器提供サービス契約一覧照会（ｅｏ光テレビ情報取得）※STB分
	 * @param opeDate 運用日付
	 * @return 処理結果情報
	 * @throws Exception 
	 */
	public static Map<String, String> checkTvMskmAvailable(X31BWebBusinessLogic bl, String screenId, HashMap<String, Object> kikiMap,
			String opeDate) throws Exception
	{
		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆テレビチェック処理(JFUCheckTvMskmAvailable.checkTvMskmAvailable)☆☆☆開始■■screenId:" + screenId);

		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = bl.getCommonInfoBean();
		String pcrsCd = getPcrsCd(commonInfoBean);

		// 【ANK-4592-00-00】テレビ新コース（スカパー用）導入対応 テレビ ＣＳコース
		if (JFUStrConst.CD00134_TV_CS_LIST.contains(pcrsCd)){
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvMskmAvailable■テレビ ＣＳコース■");
			Map<String, Object> retInfoMap = new HashMap<String, Object>();
			retInfoMap = setTvCS(bl, pcrsCd);
			return setResult(retInfoMap);
		}

		// 処理対象外
		if (isTideji(bl))
		{
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvMskmAvailable■地デジ・ＢＳコースなので処理対象外■");
			return null;
		}
		
		// パラメータチェック
		if (JFUWebCommon.isNull(bl))
		{
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvMskmAvailable■パラメータ不正:blが未設定■");
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}
		if (JFUWebCommon.isNull(screenId))
		{
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvMskmAvailable■パラメータ不正:screenIdが未設定■");
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●テレビ直リン申し込み時の各チェックを行なうか否かのフラグ値を取得
		String path = PATH_TV_MSKM_CHK.replace(RE_1, screenId);
		Map<String, String> mskmChkFlg = JFUWebCommon.getDispItemsAsMap(path, QUERY_ATTR_NAME);
		String[] mskmChkFlgAry = mskmChkFlg.get(ID_001).split(JFUStrConst.COMMA);

		if (mskmChkFlgAry.length == 0)
		{
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvMskmAvailable■FUDispDefinitionからフラグ値が取得できない為エラー■");
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}
		
		Map<String, Object> retInfoMap = new HashMap<String, Object>();
		Map<String, String> keiyakuInfomMap = new HashMap<String, String>();

		// CCAS 機器製造番号
		String ccaskikiSeizoNo = getCcasKikiSeizoNo(bl);
		// STB 機器製造番号
		String stbkikiSeizoNo = getStbKikiSeizoNo(bl);

		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvMskmAvailable■ccaskikiSeizoNo:" + ccaskikiSeizoNo);
		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvMskmAvailable■stbkikiSeizoNo:" + stbkikiSeizoNo);
		
		// ●チェック処理分岐
		for (int i = 1; i <= mskmChkFlgAry.length; i++)
		{
			if (JFUStrConst.CD00001_1.equals(mskmChkFlgAry[i-1]))
			{
				if (i >= 1 && i <= 2)
				{
					// ●STB、C-CAS機器チェック
					retInfoMap = chkCurCcasStb(bl, screenId, opeDate, i, ccaskikiSeizoNo, stbkikiSeizoNo);
				}

				if (i >= 3 && i <= 4)
				{
					// ●ｅｏＴＶ機器設置承認状態コードチェック、機器予約適用日チェック
					chkKikiCondition(bl, opeDate, i, retInfoMap);
				}

				if (i >= 5 && i <= 10)
				{
					if (JFUWebCommon.isNull(keiyakuInfomMap) || keiyakuInfomMap.size() == 0)
					{
						// ●保有するSTB機器チェックを実行し、契約状況を取得する
						keiyakuInfomMap = chkOwnStb(bl, screenId, kikiMap, opeDate, i, stbkikiSeizoNo);
					}

					// ●テレビに関する申し込み状況によるチェック
					chkReserve(bl, screenId, opeDate, i, keiyakuInfomMap);
				}
			}
		}

		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆テレビチェック処理(JFUCheckTvMskmAvailable.checkTvMskmAvailable)☆☆☆終了■■");

		return setResult(retInfoMap);

	}

	/**
	 * STB、C-CAS機器チェック
	 * <br>
	 * @param bl 部品呼び元のビジネスロジック 
	 * @param screenId 部品呼び元の画面ID
	 * @param opeDate 運用日付
	 * @param chkNo チェックNo
	 * @param ccaskikiSeizoNo C-CAS選択画面で選択されたC-CASの機器製造番号
	 * @param stbkikiSeizoNo 選択されたC-CASに紐づくSTBの機器製造番号
	 * @return 処理結果情報
	 */
	private static Map<String, Object> chkCurCcasStb(X31BWebBusinessLogic bl, String screenId, String opeDate, int chkNo, String ccaskikiSeizoNo,
			String stbkikiSeizoNo)
	{
		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.chkCurCcasStb☆☆☆開始■■chkNo:" + chkNo);
		
		// ●C-CAS機器チェック
		checkTvKikiUcwk(bl, ccaskikiSeizoNo, opeDate, chkNo, JFUStrConst.KK0771_KKTK_SVC_CD_C011);

		// ●STBチェック
		Map<String, Object> retInfoMap = checkTvKikiUcwk(bl, stbkikiSeizoNo, opeDate, chkNo, JFUStrConst.KK0771_KKTK_SVC_CD_C009);

		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.chkCurCcasStb☆☆☆終了■■");

		return retInfoMap;

	}
	
	/**
	 * ｅｏＴＶ機器設置承認状態コードチェック、機器予約適用日チェック
	 * <br>
	 * @param opeDate 運用日付
	 * @param chkNo チェックNo
	 * @param retInfoMap 処理結果情報
	 */
	private static void chkKikiCondition(X31BWebBusinessLogic bl, String opeDate, int chkNo, Map<String, Object> retInfoMap)
	{
		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.chkKikiCondition☆☆☆開始■■chkNo:" + chkNo);

		X31SDataBeanAccess kikiSvcKeiInfoCcasBean = (X31SDataBeanAccess)retInfoMap.get(CUR_STB_KIKI_INFO);
		String svcKeiPcrsCd = (String)retInfoMap.get(RTN_SVC_KEI_PCRSCD);
		
		if (chkNo == 3)
		{
			// ●ｅｏＴＶ機器設置承認状態コードチェック
			checkStb(kikiSvcKeiInfoCcasBean, svcKeiPcrsCd, chkNo);
		}
		
		if (chkNo == 4)
		{
			// ●機器予約適用日チェック
			checkRsvAplyYmd(kikiSvcKeiInfoCcasBean, opeDate, chkNo);
		}

		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.chkKikiCondition☆☆☆終了■■");

	}
	
	/**
	 * 保有するSTB機器チェック
	 * <br>
	 * @param bl 部品呼び元のビジネスロジック 
	 * @param screenId 部品呼び元の画面ID
	 * @param kikiMap EKK0341B509_機器提供サービス契約一覧照会（ｅｏ光テレビ情報取得）※STB分
	 * @param opeDate 運用日付
	 * @param chkNo チェックNo
	 * @param stbkikiSeizoNo 選択されたC-CASに紐づくSTBの機器製造番号
	 * @return 処理結果情報
	 */
	@SuppressWarnings("unchecked")
	private static Map<String, String> chkOwnStb(X31BWebBusinessLogic bl, String screenId, HashMap<String, Object> kikiMap, String opeDate,
			int chkNo, String stbkikiSeizoNo)
	{
		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.chkOwnStb☆☆☆開始■■chkNo:" + chkNo);

		Map<String, String> itemMap = new HashMap<String, String>();

		if (kikiMap == null || kikiMap.size() == 0)
		{
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkOwnStb■パラメータ:kikiMapが未設定(保有するSTB情報がない)■");
			// 契約状態エラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
		
		ArrayList kikiList = (ArrayList)kikiMap.get(EKK0341B509CBSMSG1LIST);

		Boolean curStbAri = false;
		for (int i = 0; i < kikiList.size(); i++)
		{
			HashMap kiki = (HashMap)kikiList.get(i);

			// 機器提供サービスコード
			String kktkSvcCd = (String)kiki.get(KKTK_SVC_CD);
			if (!JFUStrConst.KK0771_KKTK_SVC_CD_C009.equals(kktkSvcCd))
			{
				// STB以外は処理対象外
				continue;
			}

			// eo光テレビSTB追加変更申込等、C-CAS選択を行なわない場合
			if (stbkikiSeizoNo == null || JFUStrConst.EMPTY.equals(stbkikiSeizoNo) && itemMap.size() == 0)
			{
				// 1件目の情報を保持
				curStbAri = true;
				
				// 次月開始オプションチャンネル有無
				itemMap.put(RSV_CHANNEL_NEXT, (String)kiki.get(RSV_CHANNEL_NEXT));
				// ＳＴＢ変更予約有無(カレント)
				itemMap.put(RSV_STAT_STB, (String)kiki.get(RSV_STAT_STB));
				// コース変更予約有無(カレント)
				itemMap.put(RSV_STAT_CORSE, (String)kiki.get(RSV_STAT_CORSE));
				// ＢＳパススルー予約有無（回線）
				itemMap.put(TOTAL_RSV_STAT_BS, (String)kiki.get(TOTAL_RSV_STAT_BS));
				// ＳＴＢ追加変更予約有無（保有分） 
				itemMap.put(TOTAL_RSV_STAT_STB, (String)kiki.get(TOTAL_RSV_STAT_STB));
				// コース変更予約有無（保有分）
				itemMap.put(TOTAL_RSV_STAT_CORSE, (String)kiki.get(TOTAL_RSV_STAT_CORSE));
			}
			else
			{
				// 機器製造番号
				String kikiSeizoNo = (String)kiki.get(KIKI_SEIZO_NO);
				// カレントSTB、および保有STBの申し込み状況のフラグ値取得
				if (stbkikiSeizoNo.equals(kikiSeizoNo))
				{
					curStbAri = true;

					// 次月開始オプションチャンネル有無
					itemMap.put(RSV_CHANNEL_NEXT, (String)kiki.get(RSV_CHANNEL_NEXT));
					// ＳＴＢ変更予約有無(カレント)
					itemMap.put(RSV_STAT_STB, (String)kiki.get(RSV_STAT_STB));
					// コース変更予約有無(カレント)
					itemMap.put(RSV_STAT_CORSE, (String)kiki.get(RSV_STAT_CORSE));
					// ＢＳパススルー予約有無（回線）
					itemMap.put(TOTAL_RSV_STAT_BS, (String)kiki.get(TOTAL_RSV_STAT_BS));
					// ＳＴＢ追加変更予約有無（保有分） 
					itemMap.put(TOTAL_RSV_STAT_STB, (String)kiki.get(TOTAL_RSV_STAT_STB));
					// コース変更予約有無（保有分）
					itemMap.put(TOTAL_RSV_STAT_CORSE, (String)kiki.get(TOTAL_RSV_STAT_CORSE));
					
					// Loop処理を抜ける
					break;
				}
			}
		}

		if (!curStbAri)
		{
			// ●機器提供サービス契約存在チェック
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkOwnStb■" 
					+ "■カレントSTBに紐づく機器提供サービス契約が存在しない為エラー");
			// 契約状態エラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
		
		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkOwnStb■RSV_CHANNEL_NEXT:" + itemMap.get(RSV_CHANNEL_NEXT));
		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkOwnStb■RSV_STAT_STB:" + itemMap.get(RSV_STAT_STB));
		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkOwnStb■RSV_STAT_CORSE:" + itemMap.get(RSV_STAT_CORSE));
		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkOwnStb■TOTAL_RSV_STAT_BS:" + itemMap.get(TOTAL_RSV_STAT_BS));
		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkOwnStb■TOTAL_RSV_STAT_STB:" + itemMap.get(TOTAL_RSV_STAT_STB));
		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkOwnStb■TOTAL_RSV_STAT_CORSE:" + itemMap.get(TOTAL_RSV_STAT_CORSE));

		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.chkOwnStb☆☆☆終了■■");

		return itemMap;
	}

	/**
	 * テレビに関する申し込み状況によるチェック
	 * <br>
	 * @param bl 部品呼び元のビジネスロジック 
	 * @param screenId 部品呼び元の画面ID
	 * @param opeDate 運用日付
	 * @param chkNo チェックNo
	 * @param keiyakuInfomMap テレビに関する申し込み状況を判定できる情報を格納したMAP
	 */
	private static void chkReserve(X31BWebBusinessLogic bl, String screenId, String opeDate, int chkNo, Map<String, String> keiyakuInfomMap)
	{
		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.chkReserve☆☆☆開始■■chkNo:" + chkNo);

		if (chkNo == 5)
		{
			// ●ＢＳパススルーの申し込み有無チェック
			if (!ZERO.equals(keiyakuInfomMap.get(TOTAL_RSV_STAT_BS)))
			{
				X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkReserve■chkNo:" 
						+ chkNo + "■ＢＳパススルーの申し込み有の為エラー");
				// 契約変更手続きエラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
			}
		}

		if (chkNo == 6)
		{
			// ●オプションチャンネル次月予約有無チェック
			if (!ZERO.equals(keiyakuInfomMap.get(RSV_CHANNEL_NEXT)))
			{
				X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkReserve■chkNo:" 
						+ chkNo + "■オプションチャンネル次月予約有の為エラー");
				// 契約変更手続きエラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
			}
		}

		if (chkNo == 7)
		{
			// ●カレントSTBコース変更有無チェック
			if (!ZERO.equals(keiyakuInfomMap.get(RSV_STAT_CORSE)))
			{
				X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkReserve■chkNo:" 
						+ chkNo + "■カレントSTBコース変更有の為エラー");
				// 契約変更手続きエラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
			}
		}

		if (chkNo == 8)
		{
			// ●カレントSTB機器追加変更有無チェック
			if (!ZERO.equals(keiyakuInfomMap.get(RSV_STAT_STB)))
			{
				X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkReserve■chkNo:" 
						+ chkNo + "■カレントSTB機器追加変更有の為エラー");
				// 契約変更手続きエラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
			}
		}

		if (chkNo == 9)
		{
			// ●保有STBコース変更有無チェック
			if (!ZERO.equals(keiyakuInfomMap.get(TOTAL_RSV_STAT_CORSE)))
			{
				X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkReserve■chkNo:" 
						+ chkNo + "■保有STBコース変更有の為エラー");
				// 契約変更手続きエラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
			}
		}

		if (chkNo == 10)
		{
			// ●保有STB機器追加変更有無チェック
			if (!ZERO.equals(keiyakuInfomMap.get(TOTAL_RSV_STAT_STB)))
			{
				X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.chkReserve■chkNo:" 
						+ chkNo + "■保有STB機器追加変更有の為エラー");
				// 契約変更手続きエラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
			}
		}

		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.chkReserve☆☆☆終了■■");
	}

	/**
	 * STB、C-CAS機器チェック
	 * <br>
	 * @param bl 部品呼び元のビジネスロジック 
	 * @param kikiSeizoNo チェック対象の機器製造番号(C-CAS OR STB)
	 * @param opeDate 運用日付
	 * @param chkNo チェックNo
	 * @param kktkSvcCd チェック対象の機器提供サービスコード
	 * @return 処理結果情報
	 */
	private static Map<String, Object> checkTvKikiUcwk(X31BWebBusinessLogic bl, String kikiSeizoNo, String opeDate, int chkNo, String kktkSvcCd)
	{
		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.checkTvKikiUcwk☆☆☆開始■■chkNo:" + chkNo 
				+ "■kktkSvcCd:" + kktkSvcCd + "■kikiSeizoNo" + kikiSeizoNo);

		String svcKeiPcrsCd = null;
		String svcKeiUcwkNo = null;
		String svcKeiUcwkPcrsCd = null;

		// パラメータのチェック
		if (kikiSeizoNo == null || "".equals(kikiSeizoNo))
		{
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvKikiUcwk■パラメータ未設定:kikiSeizoNoが未設定■");
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = bl.getCommonInfoBean();

		// サービス契約.料金コースコード取得
		svcKeiPcrsCd = getPcrsCd(commonInfoBean); 
		
		Map<String, String> conditionKiki = new HashMap<String, String>();
		Map<String, String> conditionUcwk = new HashMap<String, String>();

		// ■共有フォームBeanの機器提供サービス契約情報の情報チェック
		// (条件)機器製造番号
		conditionKiki.put(CommonInfoCFConst.KIKI_SEIZO_NO_27, kikiSeizoNo);
		// (条件)機器サービスコード
		conditionKiki.put(CommonInfoCFConst.KKTK_SVC_CD_27, kktkSvcCd);

		// 共有フォームBeanの機器提供サービス契約情報から、設定した条件値に紐づく情報を取得
		if (JFUWebCommon.isNull(JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.KKTK_SVC_KEI_INFO, conditionKiki)))
		{
			// ●機器提供サービス契約存在チェック
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvKikiUcwk■" 
					+ "■共有フォームBeanの機器提供サービス契約情報にチェック対象の機器情報無しの為エラー");
			// 契約状態エラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		// (条件)機器提供サービス契約ステータス(100)
		conditionKiki.put(CommonInfoCFConst.KKTK_SVC_KEI_STAT_27, JFUStrConst.CD00056_100);

		// 共有フォームBeanの機器提供サービス契約情報から、設定した条件値に紐づく情報を取得
		X31SDataBeanAccess kikiSvcKeiInfoCcasBean =
				JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.KKTK_SVC_KEI_INFO, conditionKiki);
		if (JFUWebCommon.isNull(kikiSvcKeiInfoCcasBean))
		{
			if (chkNo == 2)
			{
				// ●機器提供サービス契約ステータスチェック(100)
				X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvKikiUcwk■chkNo:" 
						+ chkNo + "■チェック対象機器の機器提供サービス契約ステータスが「100」でない為エラー");
				// 契約変更手続きエラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
			}
			
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvKikiUcwk■" 
					+ "■チェック対象機器の機器提供サービス契約ステータス「100」のデータなし");
			
			if (chkNo == 1)
			{
				// (条件)機器提供サービス契約ステータス(030)
				conditionKiki.put(CommonInfoCFConst.KKTK_SVC_KEI_STAT_27, JFUStrConst.CD00056_030);
				
				// 共有フォームBeanの機器提供サービス契約情報から、設定した条件値に紐づく情報を取得
				kikiSvcKeiInfoCcasBean = JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.KKTK_SVC_KEI_INFO, conditionKiki);
				
				if (JFUWebCommon.isNull(kikiSvcKeiInfoCcasBean))
				{
					// ●機器提供サービス契約ステータスチェック(030,100)
					X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvKikiUcwk■chkNo:" 
							+ chkNo + "■チェック対象機器の機器提供サービス契約ステータスが「030」「100」でない為エラー");
					// 契約変更手続きエラー
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
				}
			}
		}

		// ■チェック対象機器に紐づくサービス契約内訳チェック
		// 機器提供サービス契約のサービス契約内訳番号
		svcKeiUcwkNo = kikiSvcKeiInfoCcasBean.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_NO_27, X31CWebConst.DATABEAN_GET_VALUE);
		// (条件)サービス契約内訳番号
		conditionUcwk.put(CommonInfoCFConst.SVC_KEI_UCWK_NO_24, svcKeiUcwkNo);
		// 共有フォームBeanのサービス契約内訳情報から、設定した条件値に紐づく情報を取得
		X31SDataBeanAccess[] svcKeiUcwkInfo =
				JFUWebCommon.getDataBeanListByPathWithKey(commonInfoBean, JFUWebCommon.SVC_KEI_UCWK_INFO, conditionUcwk);

		if (svcKeiUcwkInfo == null || svcKeiUcwkInfo.length == 0)
		{
			// ●サービス契約内訳存在チェック
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvKikiUcwk■" 
					+ "■共有フォームBeanのサービス契約内訳情報に、チェック対象機器に紐づくデータなし");
			// 契約状態エラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		ArrayList<String> chkStsList = new ArrayList<String>();
		for (int idx = 0; idx < svcKeiUcwkInfo.length; idx++)
		{
			// サービス契約内訳ステータスが「100」または「030」をチェックリストに設定
			svcKeiUcwkPcrsCd = JFUWebCommon.getDataBeanItemByPath(svcKeiUcwkInfo[idx], CommonInfoCFConst.PCRS_CD_24);
			String status = JFUWebCommon.getDataBeanItemByPath(svcKeiUcwkInfo[idx], CommonInfoCFConst.SVC_KEI_UCWK_STAT_24);
			if (JFUStrConst.CD00056_030.equals(status) || JFUStrConst.CD00056_100.equals(status))
			{
				chkStsList.add(status);
			}
		}

		if (chkStsList.size() == 0)
		{
			// ●サービス契約内訳ステータスチェック(030,100)
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvKikiUcwk■chkNo:" 
					+ chkNo + "■チェック対象機器に紐づくサービス契約内訳ステータスが「030」「100」でない為エラー");
			// 契約変更手続きエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
		}

		if (chkNo == 2)
		{
			if (!chkStsList.contains(JFUStrConst.CD00056_100))
			{
				// ●サービス契約内訳ステータスチェック(100)
				X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkTvKikiUcwk■chkNo:" 
						+ chkNo + "■チェック対象機器に紐づくサービス契約内訳ステータスが「100」でない為エラー");
				// 契約変更手続きエラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
			}
		}

		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.checkTvKikiUcwk☆☆☆終了■■");

		Map<String, Object> retInfoMap = new HashMap<String, Object>();
		// サービス契約内訳番号
		retInfoMap.put(RTN_SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		// サービス契約 料金コースコード
		retInfoMap.put(RTN_SVC_KEI_PCRSCD, svcKeiPcrsCd);
		// サービス契約内訳 料金コースコード
		retInfoMap.put(RTN_SVC_KEI_UCWK_PCRSCD, svcKeiUcwkPcrsCd);
		// カレントＳＴＢ機器情報
		retInfoMap.put(CUR_STB_KIKI_INFO, kikiSvcKeiInfoCcasBean);
		
		return retInfoMap;

	}

	/**
	 * ｅｏＴＶ機器設置承認状態コードチェック
	 * <br>
	 * @param kikiSvcKeiInfoBeanStb カレントSTBに紐づく共有フォームBean.機器提供サービス契約 
	 * @param pcrsCd 料金コースコード
	 * @param chkNo チェックNo
	 */
	private static void checkStb(X31SDataBeanAccess kikiSvcKeiInfoBeanStb, String pcrsCd, int chkNo)
	{
		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.checkStb☆☆☆開始■■");

		// パラメータのチェック
		if (JFUWebCommon.isNull(pcrsCd))
		{
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkStb■パラメータ未設定:pcrsCdが未設定■");
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ｅｏＴＶ機器設置承認状態コード
		String statCd = JFUWebCommon.getDataBeanItemByPath(kikiSvcKeiInfoBeanStb, CommonInfoCFConst.EO_TV_KKST_SNN_STAT_CD_27);

		// eoTV機器設置承認状態コード(EO_TV_KKST_SNN_STAT_CD)="1"(承認済み) 又は "2"(視聴制御連携済み) は正常
		if (!(JFUStrConst.CD00644_1.equals(statCd) || JFUStrConst.CD00644_2.equals(statCd)))
		{
			// ●eoTV機器設置承認状態コードチェック
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkStb■chkNo:" 
					+ chkNo + "■チェック対象機器のeoTV機器設置承認状態コードが「1」「2」でない為エラー"
					+ "■eoTV機器設置承認状態コード:" + statCd);
			// 契約変更手続きエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
		}

		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.checkStb☆☆☆終了■■");

	}

	/**
	 * 機器予約適用日チェック
	 * <br>
	 * @param kikiSvcKeiInfoBeanStb カレントSTBに紐づく共有フォームBean.機器提供サービス契約 
	 * @param opeDate 運用日付
	 * @param chkNo チェックNo
	 */
	private static void checkRsvAplyYmd(X31SDataBeanAccess kikiSvcKeiInfoBeanStb, String opeDate, int chkNo)
	{
		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.checkRsvAplyYmd☆☆☆開始■■");

		// パラメータのチェック
		if (JFUWebCommon.isNull(opeDate))
		{
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkRsvAplyYmd■パラメータ未設定:opeDateが未設定■");
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// 予約適用日＞運用日付の場合、エラー
		if (!JPCUtilCommon.isPastDate(kikiSvcKeiInfoBeanStb.sendMessageString(CommonInfoCFConst.RSV_APLY_YMD_27, X31CWebConst.DATABEAN_GET_VALUE),
				opeDate, DOJITSU_HUKUMU))
		{
			// ●機器予約適用日チェック
			X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.checkRsvAplyYmd■chkNo:" 
					+ chkNo + "■予約適用日＞運用日付の為エラー");
			// 契約状態エラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		X31SWebLog.DEBUG_LOG.debug("■■☆☆☆JFUCheckTvMskmAvailable.checkRsvAplyYmd☆☆☆終了■■");

	}

	/**
	 * C-CAS選択画面で選択されたC-CASの機器製造番号取得
	 * <br>
	 * @param bl 部品呼び元のビジネスロジック 
	 * @return C-CAS選択画面で選択されたC-CASの機器製造番号
	 */
	private static String getCcasKikiSeizoNo(X31BWebBusinessLogic bl)
	{
		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = bl.getCommonInfoBean();

		// ＳＳＯ情報の取得
		X31SDataBeanAccess ssoInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);

		// 共有フォームBeanのＳＳＯ情報.C-CASカード番号を取得
		return JFUWebCommon.getDataBeanItemByPath(ssoInfo, CommonInfoCFConst.KIKI_SEIZO_NO_21);
	}

	/**
	 * C-CAS選択画面で選択されたC-CASに紐づくSTBの機器製造番号取得
	 * <br>
	 * @param bl 部品呼び元のビジネスロジック 
	 * @return C-CAS選択画面で選択されたC-CASに紐づくSTBの機器製造番
	 */
	private static String getStbKikiSeizoNo(X31BWebBusinessLogic bl)
	{
		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = bl.getCommonInfoBean();

		// ＳＳＯ情報の取得
		X31SDataBeanAccess ssoInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);

		// 共有フォームBeanのＳＳＯ情報.機器製造番号を取得 ※CCASに紐づくSTBの機器製造番号
		return JFUWebCommon.getDataBeanItemByPath(ssoInfo, CommonInfoCFConst.KIKI_SEIZO_NO_STB_21);
	}

	/**
	 * 処理結果の編集
	 * <br>
	 * @param resultOk	処理結果
	 * @param svcKeiUcwkNo	サービス契約内訳番号
	 * @param svcKeiPcrscd	サービス契約 料金コースコード
	 * @param svcKeiUcwkPcrscd	サービス契約内訳 料金コースコード
	 * @return 処理結果情報
	 */
	private static Map<String, String> setResult(Map<String, Object> retInfoMap)
	{

		Map<String, String> resultMap = new HashMap<String, String>();

		/* 処理結果 */
		resultMap.put(RTN_RESULT, RTN_RESULT_OK);
		/* サービス契約内訳番号 */
		resultMap.put(RTN_SVC_KEI_UCWK_NO, (String)retInfoMap.get(RTN_SVC_KEI_UCWK_NO));
		/* サービス契約 料金コースコード*/
		resultMap.put(RTN_SVC_KEI_PCRSCD, (String)retInfoMap.get(RTN_SVC_KEI_PCRSCD));
		/* サービス契約内訳 料金コースコード*/
		resultMap.put(RTN_SVC_KEI_UCWK_PCRSCD, (String)retInfoMap.get(RTN_SVC_KEI_UCWK_PCRSCD));

		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.setResult■RTN_SVC_KEI_UCWK_NO:" + resultMap.get(RTN_SVC_KEI_UCWK_NO));
		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.setResult■RTN_SVC_KEI_PCRSCD:" + resultMap.get(RTN_SVC_KEI_PCRSCD));
		X31SWebLog.DEBUG_LOG.debug("■JFUCheckTvMskmAvailable.setResult■RTN_SVC_KEI_UCWK_PCRSCD:" + resultMap.get(RTN_SVC_KEI_UCWK_PCRSCD));

		return resultMap;

	}

	/**
	 * 地デジ・BSコース判定
	 * <br>
	 * @param bl 部品呼び元のビジネスロジック 
	 * @return true:地デジ false:地デジでない
	 */
	private static boolean isTideji(X31BWebBusinessLogic bl)
	{

		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = bl.getCommonInfoBean();

		// 料金コースコード 地デジ・BSコースの場合、trueを返却
		if (JFUStrConst.CD00134_A37.equals(getPcrsCd(commonInfoBean)))
		{
			return true;
		}

		return false;
		
	}
	
	/**
	 * 料金コースコード取得
	 * <br>
	 * @param commonInfoBean 共有フォームBean
	 * @return サービス契約情報 料金コースコード
	 */
	private static String getPcrsCd(X31SDataBeanAccess commonInfoBean)
	{

		// ＷＥＢ変更情報/0/現顧客契約情報/0/サービス契約情報/0/料金コースコード
		String pcrsCd =
				JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO + JFUWebCommon.SEP_0 + CommonInfoCFConst.PCRS_CD_23);

		return pcrsCd;

	}

	/**
	 * 機器提供サービスコードに紐づく機器提供サービス契約のサービス契約内訳番号取得
	 * <br>
	 * @param commonInfoBean 共有フォームBean
	 * @return サービス契約情報 料金コースコード
	 */
	public static String getKktkSvcCdSvcUcwkNo(X31SDataBeanAccessArray kktkSvcKeiList, String getKktkSvcCd, String getKikiSeizoNo)
	{
		String svcKeiUcwkNo = JFUStrConst.EMPTY;
		
		// ループ：機器提供サービス契約情報件数分
		for (int i = 0; i < kktkSvcKeiList.getCount(); i++)
		{
			X31SDataBeanAccess kktkSvcKeiInfo = kktkSvcKeiList.getDataBean(i);
			String kktkSvcCd = kktkSvcKeiInfo.sendMessageString(CommonInfoCFConst.KKTK_SVC_CD_27, X31CWebConst.DATABEAN_GET_VALUE);
			String kktkSvcKeiStat = kktkSvcKeiInfo.sendMessageString(CommonInfoCFConst.KKTK_SVC_KEI_STAT_27, X31CWebConst.DATABEAN_GET_VALUE);
	
			// 機器提供サービス契約ステータスが申し込み不可のステータスの場合、読み飛ばし
			if (!enableKktkSvcKeiStat(kktkSvcKeiStat))
			{
				continue;
			}
			
			if (getKktkSvcCd.equals(kktkSvcCd))
			{
				// 引数の機器提供サービスコードに紐づくデータの機器製造番号を取得
				String kikiSeizoNo = kktkSvcKeiInfo.sendMessageString(CommonInfoCFConst.KIKI_SEIZO_NO_27, X31CWebConst.DATABEAN_GET_VALUE);
				
				// 引数の機器製造番号を取得
				if (kikiSeizoNo != null && kikiSeizoNo.equals(getKikiSeizoNo))
				{
					// サービス契約内訳番号を取得
					svcKeiUcwkNo = kktkSvcKeiInfo.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_NO_27, X31CWebConst.DATABEAN_GET_VALUE);
				}
			}
		}
		
		return svcKeiUcwkNo;
	}
	
	/**
	 * 機器提供サービス契約ステータスチェック
	 * <br>
	 * @param serviceFormBean	サービスフォームBean
	 * @return 処理結果
	 * @throws Exception 
	 * */
	private static boolean enableKktkSvcKeiStat(String kktkSvcKeiStat)
	{
		// 画面で参照可能な機器提供サービス契約ステータスで無ければ、falseを返却
		if (JFUStrConst.CD00056_910.equals(kktkSvcKeiStat) || JFUStrConst.CD00056_920.equals(kktkSvcKeiStat))
		{
			return false;
		}

		return true;
	}

	/**
	 * テレビ ＣＳコース情報。
	 * 
	 * <br>
	 * @param bl 部品呼び元のビジネスロジック 
	 * @param pcrsCd 料金コース
	 * @return ＣＳコース情報
	 */
	public static Map<String, Object> setTvCS(X31BWebBusinessLogic bl, String pcrsCd)
	{

		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = bl.getCommonInfoBean();

		// ＳＳＯ情報の取得
		X31SDataBeanAccess ssoInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);
		// サービス契約番号
		String svcKeiNo = JFUWebCommon.getDataBeanItemByPath(ssoInfo, CommonInfoCFConst.SVC_KEI_NO_21);
		// CCAS Ｃ−ＣＡＳカード番号
		String ccaskikiSeizoNo = JFUWebCommon.getDataBeanItemByPath(ssoInfo, CommonInfoCFConst.KIKI_SEIZO_NO_21);

		Map<String, Object> retInfoMap = new HashMap<String, Object>();
		// サービス契約内訳番号
		retInfoMap.put(RTN_SVC_KEI_UCWK_NO, JFUStrConst.EMPTY);
		// サービス契約 料金コースコード
		retInfoMap.put(RTN_SVC_KEI_PCRSCD, pcrsCd);
		// サービス契約内訳 料金コースコード
		retInfoMap.put(RTN_SVC_KEI_UCWK_PCRSCD, JFUStrConst.EMPTY);
		// カレントＣ−ＣＡＳカード番号
		retInfoMap.put(CUR_STB_KIKI_INFO, ccaskikiSeizoNo);

		return retInfoMap;
	}

}
