/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：FUW01505SFLogic
*   ソースファイル名：FUW01505SFLogic.java
*   作成者          ：FJ
*   日付            ：2012年01月04日
*＜機能概要＞
*    C-CASカード番号選択画面サービスフォームBeanビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/01/04   FJ）名嶋    新規作成
*   v4.00		2012/08/20	 FJ) 岡井	 【ANK-0324-00-00】オプションチャンネル申込の早期化について
*   v5.00       2013/05/23   FJ）文元	 【ANK-1523-00-00】〔現行システム対応〕フロントＳテレビキャンペーン対応(TV直リンク)
*   v74.00      2024/12/18   FJ）美濃原  【ANK-4592-00-00】テレビ新コース（スカパー用）導入対応
*   v75.00      2025/05/08   FJ) 美濃原  【ANK-4673-00-00】テレビ新コース（スカパー用）導入対応　2025年6月フォロー案件
*   v75.01      2025/06/02   FJ) 美濃原  【ANK-4673-07-00】テレビ新コース（スカパー用）導入対応　2025年6月フォロー案件
*
**********************************************************************/
package eo.web.webview.FUW01505SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JFUStrConst;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;

/**
 * C-CASカード番号選択画面サービスフォームBeanビューロジック
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW01505SFLogic extends JCCWebBusinessLogic
{
	/** サービス契約内訳取得キー */
	private static final String KEY_SVKEIUW_NO = "KEY_SVKEIUW_NO";
	/** STB取得キー */
	private static final String KEY_STB = "KEY_STB";
	/** CCAS取得キー */
	private static final String KET_CCAS = "KET_CCAS";
	/** 空文字 */
	private static final String STRING_BLANK = JFUStrConst.EMPTY;
	/** 数字：0 */
	private static final int INT_ZERO = 0;
	/** Definition_地デジ料金コースコード取得キー */
	private static final String KEY_CS_K_CAT_CDG_BS = "cs_k-cat_cdg_bs";
	/** リクエストパラメータID(オプションサービスコード) */
	private static final String REQUEST_PARAM_OP_SVC_CD = "opsvccd";
	/** リクエストパラメータID(申込区分) */
	private static final String REQUEST_PARAM_MSKM_DIV = "mskmdiv";

	/** ＣＳコース 枠番号キー */
	private static final String KET_FRAME_NO = "KET_FRAME_NO";

	/** ＣＳコース */
	private static final String FUW09501CsTvMenu = "tv_contract_menu";
	/** ＣＳコース遷移用変換 */
	private static final List<String> convertCsTvDspList =
			Arrays.asList("tv_course_change:tv_course_change", "tv_option_channel_add:tv_option_channel_add_cs",
					"tv_option_channel_dissolution:tv_option_channel_dissolution_cs");

	/**
	 * 初期処理
	 * <br>
	 * @return	処理結果
	 * @throws Exception	例外
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{

		//共有FormBeanを取得する
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		/** 地デジの場合は当画面を表示せず次の画面へ遷移する */
		X31SDataBeanAccessArray svc_kei_info_list = commonInfoBean.getDataBeanArray(JFUWebCommon.SVC_KEI_INFO);
		X31SDataBeanAccess svc_kei_info = svc_kei_info_list.getDataBean(INT_ZERO);
		String prcsCd = svc_kei_info.sendMessageString(CommonInfoCFConst.PCRS_CD_23, X31CWebConst.DATABEAN_GET_VALUE);
		Map<String, String> map = JFUWebCommon.getDispItemsAsMap("DISPSETTING/SETTING[@screenId='FUW01505']/DISPTEXT[@groupid='prcs_cd']", "id");
		final String PCRS_CD_CDG_BS = map.get(KEY_CS_K_CAT_CDG_BS);
		String[] denyPcrsCdArray = PCRS_CD_CDG_BS.split(JFUStrConst.COMMA);
		for (int i = 0; i < denyPcrsCdArray.length; i++)
		{
			String denyPcrsCd = denyPcrsCdArray[i];
			if (denyPcrsCd.equals(prcsCd))
			{
				// 次の画面へ遷移(当画面の表示は行わない);
				skipNextScreen(commonInfoBean);
				return true;
			}
		}

		// ■ＣＳコース処理
		if (JFUWebCommon.isTvCs(commonInfoBean))
		{
			// ＣＳコースの場合
			// 選択後到達画面ＩＤを設定
			HashMap<String, String>ctrlNextScreen = getTvCsUrlInfo(commonInfoBean);
			String urlScreenId = ctrlNextScreen.get("urlScreenId");
			String selectTtuScreenId = ctrlNextScreen.get("selectTtuScreenId");

			if (isTvCsMenuDsp(urlScreenId, selectTtuScreenId))
			{
				// 「eo光テレビ契約変更／照会メニュー」へ遷移(当画面の表示は行わない)
				String nextScreenId = JFUScreenConst.SCREEN_ID_FUW09501;
				// 遷移先画面IDを設定
				commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
				// 遷移先画面名を設定
				commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
						JFUScreenConst.SCREEN_NAME_FUW09501);
				// 本来の遷移をキャンセル
				this.cancelTransferPage();
				// 次の遷移先を設定する
				this.setTransferPageId(nextScreenId + "0PJP");
			}
			else
			{
				// 「eo光テレビ契約変更／照会メニュー」以外の場合
				// @直リンク→当画面(nextボタン)→各オプション画面遷移
				// A「eo光テレビ契約変更／照会メニュー」→当画面(nextボタン)→各オプション画面遷移
				// ※CCAS番号が１つの場合は、当画面をSKIPする
				checkTvCsCS(commonInfoBean, urlScreenId, selectTtuScreenId);
			}
			return true;
		}

		//共有FormBeanから機器提供サービス契約情報を取得
		X31SDataBeanAccessArray bean_stb_list = commonInfoBean.getDataBeanArray(JFUWebCommon.KKTK_SVC_KEI_INFO);
		//出力用のFormBeanを用意
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();
		X31SDataBeanAccessArray stbBeanList = serviceFormBean.getDataBeanArray(FUW01505SFConst.STB_LIST);

		//STBマップリスト
		ArrayList<HashMap<String, String>> stb_array = new ArrayList<HashMap<String, String>>();
		//C-CASマップリスト
		ArrayList<HashMap<String, String>> ccas_array = new ArrayList<HashMap<String, String>>();
		//参照用FormBeanをループでまわす
		for (int i = 0; i < bean_stb_list.getCount(); i++)
		{
			X31SDataBeanAccess bean_stb_oneline = bean_stb_list.getDataBean(i);
			String kktkSvcKeiStat = bean_stb_oneline.sendMessageString(CommonInfoCFConst.KKTK_SVC_KEI_STAT_27, X31CWebConst.DATABEAN_GET_VALUE);
			String vonuKktkSvcCd = bean_stb_oneline.sendMessageString(CommonInfoCFConst.KKTK_SVC_CD_27, X31CWebConst.DATABEAN_GET_VALUE);
			String kikiSeizoNo = bean_stb_oneline.sendMessageString(CommonInfoCFConst.KIKI_SEIZO_NO_27, X31CWebConst.DATABEAN_GET_VALUE);
			String SerUtiKeiNo = bean_stb_oneline.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_NO_27, X31CWebConst.DATABEAN_GET_VALUE);
			String eoTvKkstSnnJtCd = bean_stb_oneline.sendMessageString(CommonInfoCFConst.EO_TV_KKST_SNN_STAT_CD_27, X31CWebConst.DATABEAN_GET_VALUE);

			// 機器製造番号が未設定以外かつ機器提供サービス契約ステータスが「030」または「100」の場合は対象
			if(!JFUStrConst.EMPTY.equals(kikiSeizoNo)
					&& (JFUStrConst.CD00056_030.equals(kktkSvcKeiStat) || JFUStrConst.CD00056_100.equals(kktkSvcKeiStat)))
			{
				// STBかつeoTV機器設置承認状態コードが「1」または「2」の場合、STB格納用に入れる
				if (JFUStrConst.KK0771_KKTK_SVC_CD_C009.equals(vonuKktkSvcCd)
						&& (JFUStrConst.CD00644_1.equals(eoTvKkstSnnJtCd) || JFUStrConst.CD00644_2.equals(eoTvKkstSnnJtCd)))
				{
					HashMap<String, String> stbMap = new HashMap<String, String>();
					stbMap.put(KEY_SVKEIUW_NO, SerUtiKeiNo);
					stbMap.put(KEY_STB, kikiSeizoNo);
					stb_array.add(stbMap);
				}
				// C-CASの場合、画面出力用に入れる
				if (JFUStrConst.KK0771_KKTK_SVC_CD_C011.equals(vonuKktkSvcCd))
				{
					HashMap<String, String> casMap = new HashMap<String, String>();
					casMap.put(KEY_SVKEIUW_NO, SerUtiKeiNo);
					casMap.put(KET_CCAS, kikiSeizoNo);
					ccas_array.add(casMap);
				}
			}
		}

		/** ソート処理 (Collections.sortを利用し、複数件の場合CCASカード番号順に昇順ソートを行う) */
		if (1 < ccas_array.size())
		{
			Collections.sort(ccas_array, new Comparator()
			{
				public int compare(Object o1, Object o2)
				{
					HashMap map1 = (HashMap)o1;
					HashMap map2 = (HashMap)o2;
					String str1 = (String)map1.get(KET_CCAS);
					String str2 = (String)map2.get(KET_CCAS);
					return str1.compareTo(str2);
				}

			});
		}

		Iterator<HashMap<String, String>> cas_chk_Bean = ccas_array.iterator();

		//CCAS格納用をまわす
		int beanIndex = 0;
		while (cas_chk_Bean.hasNext())
		{
			HashMap<String, String> casMap = cas_chk_Bean.next();
			String casMapSvkeiuwNo = casMap.get(KEY_SVKEIUW_NO);
			String casNo = casMap.get(KET_CCAS);

			Iterator<HashMap<String, String>> stb_chk_Bean = stb_array.iterator();
			//STB用をまわす
			while (stb_chk_Bean.hasNext())
			{
				HashMap<String, String> stbMap = stb_chk_Bean.next();
				String stbMapSvkeiuwNo = stbMap.get(KEY_SVKEIUW_NO);
				String stbNo = stbMap.get(KEY_STB);

				//C-CAS表示用とサービス契約内訳番号が一緒だった場合
				if (stbMapSvkeiuwNo.equals(casMapSvkeiuwNo))
				{
					stbBeanList.addDataBean();
					X31SDataBeanAccess stbItem = stbBeanList.getDataBean(beanIndex);
					// STB番号セット
					stbItem.sendMessageString(FUW01505SFConst.KIKI_SEIZO_NO_STB_01, X31CWebConst.DATABEAN_SET_VALUE, stbNo);
					// CCAS番号セット
					stbItem.sendMessageString(FUW01505SFConst.KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_SET_VALUE, casNo);
					//表示用CCAS番号に加工
					stbItem.sendMessageString(FUW01505SFConst.DISP_KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_SET_VALUE, ccasconv(casNo));
					beanIndex++;
					break;
				}
			}

		}

		if (stbBeanList.getCount() == 0) {
			// デバッグログ
			com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("★ STBビーンリストが0件：契約状態エラー ★");
			// STBビーンリストが0件の場合、"0102"（契約状態エラー）
			DEBUG_LOG.info("■■■FUW01505 (1)C-CASカード番号選択画面：契約状態エラー■■■");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
		
		// オプションチャンネルの直リンクの場合、申し込みたいオプションチャンネルコードと申込区分を
		// リクエストパラメータから取得して、ＳＳＯ情報にセットする
		setSsoInfoFmRequestParam(commonInfoBean);

		/** STBビーンリストが1件の場合は画面を表示せずにSSOに情報をセットして遷移する */
		if (1 == stbBeanList.getCount())
		{
			X31SDataBeanAccess stbItem = stbBeanList.getDataBean(INT_ZERO);
			String stbKkszNo = stbItem.sendMessageString(FUW01505SFConst.KIKI_SEIZO_NO_STB_01, X31CWebConst.DATABEAN_GET_VALUE);
			String cCasNo = stbItem.sendMessageString(FUW01505SFConst.KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_GET_VALUE);
			// SSO情報へ登録
			setSsoInfo(commonInfoBean, cCasNo, stbKkszNo);
			// 次の画面へ遷移(当画面の表示は行わない);
			skipNextScreen(commonInfoBean);
		}

		JSYwebLog.println(JSYLogBase.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		return true;
	}

	/**
	 * 次へボタン押下処理（eo光テレビコース変更申込確認画面へ遷移）
	 * <br>
	 * @return	処理結果
	 * @throws Exception 例外
	 */
	public boolean next() throws Exception
	{

		// サービスフォームビーン
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();
		// 共有フォームビーン
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// STBビーンリスト(サービスフォームビーン)
		X31SDataBeanAccessArray stbBeanList = serviceFormBean.getDataBeanArray(FUW01505SFConst.STB_LIST);

		// 選択値を取得
		String selIndex = serviceFormBean.sendMessageString(FUW01505SFConst.KIKI_SEIZO_NO_SEL, X31CWebConst.DATABEAN_GET_VALUE);

		// 選択値から該当するBeanを取得する
		X31SDataBeanAccess stbItem = stbBeanList.getDataBean(Integer.valueOf(selIndex));

		// C-CAS番号取得
		String cCasNo = stbItem.sendMessageString(FUW01505SFConst.KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_GET_VALUE);
		// STB番号取得
		String stbKkszNo = stbItem.sendMessageString(FUW01505SFConst.KIKI_SEIZO_NO_STB_01, X31CWebConst.DATABEAN_GET_VALUE);

		// SSO情報へ設定
		setSsoInfo(commonInfoBean, cCasNo, stbKkszNo);

		// 画面遷移
		if (JFUWebCommon.isTvCs(commonInfoBean))
		{
			// ＣＳコースの場合
			nextScreenTvCs(commonInfoBean);
		}
		else
		{
			nextScreen(commonInfoBean);
		}
		
		// 選択後到達画面ＩＤの画面制御終了のため初期化
		commonInfoBean.sendMessageString(CommonInfoCFConst.SELECT_TTU_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.EMPTY);

		return true;
	}

	/**
	 * 画面遷移処理
	 * <br>
	 * @return
	 * @throws Exception 例外
	 */
	private boolean nextScreen(X31SDataBeanAccess commonInfoBean) throws Exception
	{
		/** 遷移先画面情報取得処理 */
		X31SDataBeanAccessArray sso_info_list = commonInfoBean.getDataBeanArray(JFUWebCommon.SSO_INFO);
		X31SDataBeanAccess sso_info_bean = sso_info_list.getDataBean(INT_ZERO);
		String urlScreenId = sso_info_bean.sendMessageString(CommonInfoCFConst.URL_SCREEN_ID_21, X31CWebConst.DATABEAN_GET_VALUE);

		Map<String, String> nextScreenInfoMap = getNextScreenInfo();
		String nextScreenInfo[] = nextScreenInfoMap.get(urlScreenId).split(",");
		String nextScreenId = nextScreenInfo[0];
		String nextScreenName = nextScreenInfo[1];

		/** 画面遷移を行う */
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		return true;
	}

	/**
	 * 当画面を表示せず次画面へ遷移
	 * <br>
	 * @return
	 * @throws Exception 例外
	 */
	private boolean skipNextScreen(X31SDataBeanAccess commonInfoBean) throws Exception
	{
		/** 遷移先画面情報取得処理 */
		X31SDataBeanAccessArray sso_info_list = commonInfoBean.getDataBeanArray(JFUWebCommon.SSO_INFO);
		X31SDataBeanAccess sso_info_bean = sso_info_list.getDataBean(INT_ZERO);
		String urlScreenId = sso_info_bean.sendMessageString(CommonInfoCFConst.URL_SCREEN_ID_21, X31CWebConst.DATABEAN_GET_VALUE);

		Map<String, String> nextScreenInfoMap = getNextScreenInfo();
		String nextScreenInfo[] = nextScreenInfoMap.get(urlScreenId).split(",");
		String nextScreenId = nextScreenInfo[0];
		String nextScreenName = nextScreenInfo[1];

		/** 画面遷移を行う */
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		// 本来の遷移をキャンセル
		this.cancelTransferPage();
		// 次の遷移先を設定する
		this.setTransferPageId(nextScreenId + "0PJP");


		return true;
	}

	/**
	 * SSO情報に必要な値をセットする
	 * <br>
	 * @param X31SDataBeanAccess 共有フォームビーン
	 * @param svcKeiNo サービス契約番号
	 * @param cCasNo C-CASカード番号
	 * @param stbKkszNo STB機器製造番号
	 * @return
	 * @throws Exception 例外
	 */
	private boolean setSsoInfo(X31SDataBeanAccess commonInfoBean, String cCasNo, String stbKkszNo) throws Exception
	{
		// SSO情報リスト取得
		X31SDataBeanAccessArray ssoInfoList = commonInfoBean.getDataBeanArray(JFUWebCommon.SSO_INFO);
		X31SDataBeanAccess ssoInfo = ssoInfoList.getDataBean(INT_ZERO);

		// SSO情報.サービス契約番号取得
		String SsoSvcKeiNo = ssoInfo.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_21, X31CWebConst.DATABEAN_GET_VALUE);

		// SSO情報.サービス契約番号がNullまたは空文字の場合
		if (null == SsoSvcKeiNo || STRING_BLANK.equals(SsoSvcKeiNo))
		{
			// サービス契約情報からサービス契約番号をセットする
			X31SDataBeanAccessArray svcKeiInfoList = commonInfoBean.getDataBeanArray(JFUWebCommon.SVC_KEI_INFO);
			X31SDataBeanAccess svcKeiInfo = svcKeiInfoList.getDataBean(INT_ZERO);
			String svcKeiNo = svcKeiInfo.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_23, X31CWebConst.DATABEAN_GET_VALUE);
			ssoInfo.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_21, X31CWebConst.DATABEAN_SET_VALUE, svcKeiNo);
		}

		// 値をセットする
		ssoInfo.sendMessageString(CommonInfoCFConst.KIKI_SEIZO_NO_21, X31CWebConst.DATABEAN_SET_VALUE, cCasNo); // C-CASカード番号
		ssoInfo.sendMessageString(CommonInfoCFConst.KIKI_SEIZO_NO_STB_21, X31CWebConst.DATABEAN_SET_VALUE, stbKkszNo); // STB機器製造番号

		return true;
	}

	/**
	 * C-CAS番号を表示用に編集して返す
	 * <br>
	 * @param ccas
	 * @return
	 * @throws Exception
	 */
	private String ccasconv(String ccas) throws Exception
	{
		return ccas.substring(0, 4) + "-" + ccas.substring(4, 8) + "-" + ccas.substring(8, 12) + "-" + ccas.substring(12, 16) + "-"
				+ ccas.substring(16);
	}

	/**
	 * 次の遷移先画面情報を取得する
	 * <br>
	 * @return
	 * @throws Exception
	 */
	private Map<String, String> getNextScreenInfo() throws Exception
	{

		Map<String, String> map = JFUWebCommon.getDispItemsAsMap("DISPSETTING/SETTING[@screenId='FUW01505']/DISPTEXT[@groupid='next_screen']", "id");

		return map;
	}
	
	/**
	 * SSO情報にリクエストパラメータから取得した値を設定する
	 * <br>
	 * @param X31SDataBeanAccess 共有フォームビーン
	 * @return
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private void setSsoInfoFmRequestParam(X31SDataBeanAccess commonInfoBean) throws Exception
	{
		// リクエストパラメータ取得
		Map<String, Object> reqMap = getRequestParams();
		
		String opsvccd = JFUStrConst.EMPTY;
		String mskmdiv = JFUStrConst.EMPTY;
		
		if (reqMap.containsKey(REQUEST_PARAM_OP_SVC_CD))
		{
			opsvccd = (String)reqMap.get(REQUEST_PARAM_OP_SVC_CD);
		}
		if (reqMap.containsKey(REQUEST_PARAM_MSKM_DIV))
		{
			mskmdiv = (String)reqMap.get(REQUEST_PARAM_MSKM_DIV);
		}
		
		// SSO情報リスト取得
		X31SDataBeanAccessArray ssoInfoList = commonInfoBean.getDataBeanArray(JFUWebCommon.SSO_INFO);
		X31SDataBeanAccess ssoInfo = ssoInfoList.getDataBean(INT_ZERO);

		// オプションサービスコード
		ssoInfo.sendMessageString(CommonInfoCFConst.OP_SVC_CD_21, X31CWebConst.DATABEAN_SET_VALUE, opsvccd);
		// 申込区分
		ssoInfo.sendMessageString(CommonInfoCFConst.MSKM_KBN_21, X31CWebConst.DATABEAN_SET_VALUE, mskmdiv); 
	}

	/**
	 * SSO情報に設定されているC-CASカード番号を取得する
	 * <br>
	 * @param X31SDataBeanAccess 共有フォームビーン
	 * @param svcKeiNo サービス契約番号
	 * @param cCasNo C-CASカード番号
	 * @param stbKkszNo STB機器製造番号
	 * @return
	 * @throws Exception 例外
	 */
	private String getCcasNo(X31SDataBeanAccess commonInfoBean) throws Exception
	{
		// SSO情報リスト取得
		X31SDataBeanAccessArray ssoInfoList = commonInfoBean.getDataBeanArray(JFUWebCommon.SSO_INFO);
		X31SDataBeanAccess ssoInfo = ssoInfoList.getDataBean(INT_ZERO);

		// SSO情報.サービス契約番号取得
		String SsoSvcKeiNo = ssoInfo.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_21, X31CWebConst.DATABEAN_GET_VALUE);

		// SSO情報.サービス契約番号がNullまたは空文字の場合
		if (null == SsoSvcKeiNo || STRING_BLANK.equals(SsoSvcKeiNo))
		{
			return JFUStrConst.EMPTY;
		}

		return ssoInfo.sendMessageString(CommonInfoCFConst.KIKI_SEIZO_NO_21, X31CWebConst.DATABEAN_GET_VALUE);

	}

	/**
	 * ＵＲＬ情報／本来遷移したい画面情報を取得する[ＣＳコース]
	 * <br>
	 * @return
	 * @throws Exception 例外
	 */
	private HashMap<String, String> getTvCsUrlInfo(X31SDataBeanAccess commonInfoBean) throws Exception
	{
		String select_ttu_screen_id = commonInfoBean.sendMessageString(CommonInfoCFConst.SELECT_TTU_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE);
		X31SDataBeanAccessArray sso_info_list = commonInfoBean.getDataBeanArray(JFUWebCommon.SSO_INFO);
		X31SDataBeanAccess sso_info_bean = sso_info_list.getDataBean(INT_ZERO);
		String urlScreenId = sso_info_bean.sendMessageString(CommonInfoCFConst.URL_SCREEN_ID_21, X31CWebConst.DATABEAN_GET_VALUE);

		HashMap<String, String> resutlMap = new HashMap<String, String>();
		resutlMap.put("urlScreenId", urlScreenId);
		resutlMap.put("selectTtuScreenId", select_ttu_screen_id);

		return resutlMap;
	}

	/**
	 * 「eo光テレビ契約変更／照会メニュー」への遷移依頼か判定を行う。[ＣＳコース]
	 * 
	 * @param urlScreenId ＵＲＬ画面ＩＤ
	 * @param selectTtuScreenId 選択後到達画面ＩＤ
	 * @return true:
	 */
	private boolean isTvCsMenuDsp(String urlScreenId, String selectTtuScreenId)
	{
		if (JFUScreenConst.SCREEN_ID_FUW09501.equals(selectTtuScreenId))
		{
			return true;
		}
		if (JFUWebCommon.isNull(selectTtuScreenId) && FUW09501CsTvMenu.equals(urlScreenId))
		{
			return true;
		}
		return false;
	}

	/**
	 * ＣＳコース制御処理<br/>
	 * ＣＣＡＳの件数によって遷移先を決定する
	 * 
	 * @param commonInfoBean 
	 * @param urlScreenId ＵＲＬ画面ＩＤ
	 * @param selectTtuScreenId 選択後到達画面ＩＤ
	 * @throws Exception
	 */
	private void checkTvCsCS(X31SDataBeanAccess commonInfoBean, String urlScreenId, String selectTtuScreenId) throws Exception
	{
		//共有FormBeanから「ＣＡＳカード情報」を取得
		X31SDataBeanAccessArray bean_stb_list = commonInfoBean.getDataBeanArray(JFUWebCommon.CASCD_INFO);
		//出力用のFormBeanを用意
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();
		X31SDataBeanAccessArray stbBeanList = serviceFormBean.getDataBeanArray(FUW01505SFConst.STB_LIST);

		Map<String, String> resultMap = getTvCsNextScreenName(commonInfoBean, urlScreenId, selectTtuScreenId);

		// TODO：サービス契約ステータス＝０３０、１００ 申込画面。解約は確認が必要
		//C-CASマップリスト
		ArrayList<HashMap<String, String>> ccas_array = new ArrayList<HashMap<String, String>>();
		//参照用FormBeanをループでまわす
		for (int i = 0; i < bean_stb_list.getCount(); i++)
		{
			X31SDataBeanAccess bean_stb_oneline = bean_stb_list.getDataBean(i);

			String cascd_no = bean_stb_oneline.sendMessageString(CommonInfoCFConst.CASCD_NO_72, X31CWebConst.DATABEAN_GET_VALUE);
			String frame_no = bean_stb_oneline.sendMessageString(CommonInfoCFConst.FRAME_NO_72, X31CWebConst.DATABEAN_GET_VALUE);
			String sptv_rnk_stat = bean_stb_oneline.sendMessageString(CommonInfoCFConst.SPTV_RNK_STAT_72, X31CWebConst.DATABEAN_GET_VALUE);
			String svc_kei_no = bean_stb_oneline.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_72, X31CWebConst.DATABEAN_GET_VALUE);
			String catv_cust_no = bean_stb_oneline.sendMessageString(CommonInfoCFConst.CATV_CUST_NO_72, X31CWebConst.DATABEAN_GET_VALUE);
			String cas_no_add_ymd = bean_stb_oneline.sendMessageString(CommonInfoCFConst.CAS_NO_ADD_YMD_72, X31CWebConst.DATABEAN_GET_VALUE);
			String cas_no_del_ymd = bean_stb_oneline.sendMessageString(CommonInfoCFConst.CAS_NO_DEL_YMD_72, X31CWebConst.DATABEAN_GET_VALUE);
			String keyopn_ymd = bean_stb_oneline.sendMessageString(CommonInfoCFConst.KEYOPN_YMD_72, X31CWebConst.DATABEAN_GET_VALUE);
			String csch_keyopn_ymd = bean_stb_oneline.sendMessageString(CommonInfoCFConst.CSCH_KEYOPN_YMD_72, X31CWebConst.DATABEAN_GET_VALUE);
			String cas_no_aply_ymd = bean_stb_oneline.sendMessageString(CommonInfoCFConst.CAS_NO_APLY_YMD_72, X31CWebConst.DATABEAN_GET_VALUE);

			// TODO: 各画面で表示対象となる「CASカード管理テーブル.スカパー連携ステータス」をチェックする。
			if (JFUScreenConst.SCREEN_ID_FUW12401.equals(resultMap.get("nextScreenId")))
			{
				// オプションチャンネル申込
				if (!JFUStrConst.TVCS_OPCH_YUKO_SPTV_RNK_STAT.contains(sptv_rnk_stat))
				{
					continue;
				}
			} else if (JFUScreenConst.SCREEN_ID_FUW01501.equals(resultMap.get("nextScreenId")))
			{
				// コース変更
				if (!JFUStrConst.TVCS_CSCHG_YUKO_SPTV_RNK_STAT.contains(sptv_rnk_stat))
				{
					continue;
				}
			}
			if (!JFUWebCommon.isNull(cascd_no))
			{
				HashMap<String, String> casMap = new HashMap<String, String>();
				casMap.put(KET_CCAS, cascd_no);
				casMap.put(KET_FRAME_NO, frame_no);
				ccas_array.add(casMap);
			}
		}

		/** ソート処理 (Collections.sortを利用し、複数件の場合CCASカード番号順に昇順ソートを行う) */
		if (1 < ccas_array.size())
		{
			Collections.sort(ccas_array, new Comparator()
			{
				public int compare(Object o1, Object o2)
				{
					HashMap map1 = (HashMap)o1;
					HashMap map2 = (HashMap)o2;
					String str1 = (String)map1.get(KET_CCAS);
					String str2 = (String)map2.get(KET_CCAS);
					return str1.compareTo(str2);
				}

			});
		}

		Iterator<HashMap<String, String>> cas_chk_Bean = ccas_array.iterator();

		//CCAS格納用をまわす
		int beanIndex = 0;
		while (cas_chk_Bean.hasNext())
		{
			HashMap<String, String> casMap = cas_chk_Bean.next();
			String casNo = casMap.get(KET_CCAS);

			stbBeanList.addDataBean();
			X31SDataBeanAccess stbItem = stbBeanList.getDataBean(beanIndex);
			// CCAS番号セット
			stbItem.sendMessageString(FUW01505SFConst.KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_SET_VALUE, casNo);
			//表示用CCAS番号に加工
			stbItem.sendMessageString(FUW01505SFConst.DISP_KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_SET_VALUE, ccasconv(casNo));
			beanIndex++;

		}

		if (JFUScreenConst.SCREEN_ID_FUW01501.equals(resultMap.get("nextScreenId"))) 
		{
			if (!JFUWebCommon.isAnk4673Open(JFUWebCommon.getOpeDate(this, null)))
			{
				// 蓋閉じ中はエラー
				DEBUG_LOG.info("■■■FUW01505 (4)C-CASカード番号選択画面：蓋閉じ中エラー■■■");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
			// ＣＳのコース変更画面への遷移の場合
			if (stbBeanList.getCount() != bean_stb_list.getCount())
			{
				// 全ＣＣＡＳのスカパー連携が有効なステータスか判定（チェック前とチェック後のリスト件数が異なる場合はエラー）
				DEBUG_LOG.info("■■■FUW01505 (3)C-CASカード番号選択画面：TVCSコース変更状態エラー■■■");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
			else if (stbBeanList.getCount() == 0)
			{
				//TODO: ダミー設定。
				stbBeanList.addDataBean();
				X31SDataBeanAccess stbItem = stbBeanList.getDataBean(beanIndex);
				stbItem.sendMessageString(FUW01505SFConst.KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.HALF_SPACE);
			}
		}
		else
		{
			if (stbBeanList.getCount() == 0)
			{
				// デバッグログ
				com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("★ CASビーンリストが0件：契約状態エラー ★");
				// STBビーンリストが0件の場合、"0102"（契約状態エラー）
				DEBUG_LOG.info("■■■FUW01505 (2)C-CASカード番号選択画面：TVCS契約状態エラー■■■");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
		}

		// オプションチャンネルの直リンクの場合、申し込みたいオプションチャンネルコードと申込区分を
		// リクエストパラメータから取得して、ＳＳＯ情報にセットする
		setSsoInfoFmRequestParam(commonInfoBean);

		/** 「STBビーンリスト(CCASカード)が1件」又は「コース変更」の場合は画面を表示せずにSSOに情報をセットして遷移する */
		if ((1 == stbBeanList.getCount())
				|| (JFUScreenConst.SCREEN_ID_FUW01501.equals(resultMap.get("nextScreenId"))))
		{
			X31SDataBeanAccess stbItem = stbBeanList.getDataBean(INT_ZERO);
			String stbKkszNo = JFUStrConst.EMPTY;
			String cCasNo = stbItem.sendMessageString(FUW01505SFConst.KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_GET_VALUE);
			// SSO情報へ登録
			setSsoInfo(commonInfoBean, cCasNo, stbKkszNo);
			// 次の画面へ遷移(当画面の表示は行わない);
			skipNextScreenTvCS(commonInfoBean, urlScreenId, selectTtuScreenId);
		}

		JSYwebLog.println(JSYLogBase.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
	}

	/**
	 * 当画面を表示せず次画面へ遷移[ＣＳコース]
	 * <br>
	 * @param commonInfoBean 共有フォームビーン
	 * @param urlScreenId ＵＲＬ画面ＩＤ
	 * @param selectTtuScreenId 選択後到達画面ＩＤ
	 * @return
	 * @throws Exception 例外
	 */
	private boolean skipNextScreenTvCS(X31SDataBeanAccess commonInfoBean, String urlScreenId, String selectTtuScreenId) throws Exception
	{

		Map<String, String> resultMap = getTvCsNextScreenName(commonInfoBean, urlScreenId, selectTtuScreenId);
		String nextScreenId = resultMap.get("nextScreenId");
		String nextScreenName = resultMap.get("nextScreenName");

		/** 画面遷移を行う */
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		// 本来の遷移をキャンセル
		this.cancelTransferPage();
		// 次の遷移先を設定する
		this.setTransferPageId(nextScreenId + "0PJP");

		return true;
	}

	/**
	 * 画面遷移処理
	 * <br>
	 * @return
	 * @throws Exception 例外
	 */
	private boolean nextScreenTvCs(X31SDataBeanAccess commonInfoBean) throws Exception
	{
		HashMap<String, String>ctrlNextScreen = getTvCsUrlInfo(commonInfoBean);
		String urlScreenId = ctrlNextScreen.get("urlScreenId");
		String selectTtuScreenId = ctrlNextScreen.get("selectTtuScreenId");

		Map<String, String> resultMap = getTvCsNextScreenName(commonInfoBean, urlScreenId, selectTtuScreenId);
		String nextScreenId = resultMap.get("nextScreenId");
		String nextScreenName = resultMap.get("nextScreenName");

		/** 画面遷移を行う */
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		return true;
	}

	/**
	 * 共有フォームBean.ＷＥＢ変更情報.ＳＳＯ情報の<br/>
	 * ＵＲＬ画面ＩＤ、選択後到達画面ＩＤを元に、本来遷移する画面情報を取得する。
	 * 
	 * @param commonInfoBean 共有フォームBean
	 * @param urlScreenId ＵＲＬ画面ＩＤ
	 * @param selectTtuScreenId
	 * @return 画面情報
	 * @throws Exception
	 */
	private Map<String, String> getTvCsNextScreenName(X31SDataBeanAccess commonInfoBean, String urlScreenId, String selectTtuScreenId) throws Exception {

		Map<String, String> resultMap = new HashMap<String, String>();
		String nextScreenId = JFUStrConst.EMPTY;
		String nextScreenName = JFUStrConst.EMPTY;
		if (JFUWebCommon.isNull(selectTtuScreenId)) {
			// ＣＳコース用のキーに変更する（例：tv_option_channel_add →
			// tv_option_channel_dissolution_cs）に置き換える。
			resultMap = getTvCsScreenIDFromUrl(urlScreenId);
		} else {
			nextScreenId = selectTtuScreenId;
			nextScreenName = getScreenName(selectTtuScreenId);
			resultMap.put("nextScreenId", nextScreenId);
			resultMap.put("nextScreenName", nextScreenName);
		}
		return resultMap;
	}

	/**
	 * ＵＲＬから遷移先の画面ＩＤを取得[ＣＳコース]
	 * @param urlScreenId URL
	 * @return 遷移先画面ＩＤ、遷移先画面名称
	 * @throws Exception
	 */
	private Map<String, String> getTvCsScreenIDFromUrl(String urlScreenId) throws Exception
	{

		String keyUrlScreenId = urlScreenId;
		Map<String, String> resultMap = new HashMap<String, String>();
		// ＣＳコース用のキーに変更する（例：tv_option_channel_add → tv_option_channel_dissolution_cs）に置き換える。
		for (String converStr : convertCsTvDspList)
		{
			String cnvertUrl[] = converStr.split(":");
			if (urlScreenId.equals(cnvertUrl[0]))
			{
				keyUrlScreenId = cnvertUrl[1];
				break;
			}
		}

		// プロパティから画面情報を取得する。
		Map<String, String> nextScreenInfoMap = getNextScreenInfo();
		String nextScreenInfo[] = nextScreenInfoMap.get(keyUrlScreenId).split(",");
		String nextScreenId = nextScreenInfo[0];
		String nextScreenName = nextScreenInfo[1];
		resultMap.put("nextScreenId", nextScreenId);
		resultMap.put("nextScreenName", nextScreenName);
		return resultMap;
	}

	/**
	 * 画面名取得
	 * @param screenId 画面ID
	 * @return 画面名
	 */
	private String getScreenName(String screenId)
	{
		String nextScreenName = JFUStrConst.EMPTY;
		if (JFUScreenConst.SCREEN_ID_FUW12401.equals(screenId))
		{
			nextScreenName = JFUScreenConst.SCREEN_NAME_FUW12401;
		}
		else if (JFUScreenConst.SCREEN_ID_FUW12501.equals(screenId))
		{
			nextScreenName = JFUScreenConst.SCREEN_NAME_FUW12501;
		}
		else if (JFUScreenConst.SCREEN_ID_FUW01501.equals(screenId))
		{
			nextScreenName = JFUScreenConst.SCREEN_NAME_FUW01501;
		}
		return nextScreenName;
	}

}