/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：FUW12401SFLogic
*   ソースファイル名：FUW12401SFLogic.java
*   作成者          ：富士通
*   日付            ：2024年12月18日
*＜機能概要＞
*   eo光テレビオプションチャンネル追加（ＣＳコース） ビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v74.00      2024/12/18   FJ）美濃原 【ANK-4592-00-00】テレビ新コース（スカパー用）導入対応
**********************************************************************/
package eo.web.webview.FUW12401SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
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.common.constant.JPCModelConstant;
import eo.common.util.JFUCommonUtil;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.FUW12402SF.FUW12402SFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0380_FUSV0380OPDBMapper;

/**
 * eo光テレビオプションチャンネル追加（ＣＳコース）画面サービスフォームBeanビューロジックです。
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW12401SFLogic extends JCCWebBusinessLogic
{

	/** サービス:FUSV0380:eo光テレビオプションチャンネル追加(初期表示) */
	private static final String FUSV_ID_FUSV0380 = "FUSV0380";

	/** サービス:FUSV0381:eo光テレビオプションチャンネル追加確認(申込) */
	private static final String FUSV_ID_FUSV0381 = "FUSV0381";

	/** 同日を含む／含まないの指定フラグ("1"：含む) */
	private static final String DOJITSU_HUKUMU = "1";

	/** 同日を含む／含まないの指定フラグ("0"：含まない) */
	private static final String DOJITSU_HUKUMANAI = "0";

	/** 表示フラグ("1"：表示) */
	private static final String DISP_FLG_ON = "1";

	/** 表示フラグ("0"：非表示) */
	private static final String DISP_FLG_OFF = "0";

	/** 申込区分("1"：今すぐ視聴) */
	private static final String MSKM_DIV_IMASUGU = "1";

	/** 申込区分("2"：来月から視聴) */
	private static final String MSKM_DIV_RAIGETSU = "2";

	/** 有効フラグ("0"：無効) */
	private static final String YUKO_FLG_OFF = "0";

	/** オプションチャンネル解約対象抽出フラグ("1"：抽出対象) */
	private static final String OPCH_DSL_TG_CHSHT_FLG_TG = "1";

	/** 画面定義ノード取得部品設定値(クエリ:表示文字列) */
	private static final String GET_DISP_MAP_SET_QUERY_TEXT = "DISPSETTING/SETTING[@screenId='FUW12401']/DISPTEXT[@groupid='";

	/** 画面定義ノード取得部品設定値(クエリ：表示制御) */
	private static final String GET_DISP_MAP_SET_QUERY_CTL = "DISPSETTING/SETTING[@screenId='FUW12401']/DISPCTL[@groupid='";

	/** 画面定義ノード取得部品設定値(クエリ：末尾記号)  */
	private static final String GET_DISP_MAP_SET_QUERY_END = "']";

	/** 画面定義ノード取得部品設定値(属性名) */
	private static final String GET_DISP_MAP_SET_ZOKUSEI = "id";

	/** プロパティID(備考有効開始日) */
	private static final String PROPERTY_BIKO_FROM = "BIKO_FROM";

	/** プロパティID(備考有効終了日) */
	private static final String PROPERTY_BIKO_TO = "BIKO_TO";

	/** プロパティID(料金有効開始日) */
	private static final String PROPERTY_PRC_FROM = "PRC_FROM";

	/** プロパティID(料金有効終了日) */
	private static final String PROPERTY_PRC_TO = "PRC_TO";

	/** プロパティID(有効無効制御有効開始日) */
	private static final String PROPERTY_YUKOMUKO_FROM = "YUKOMUKO_FROM";

	/** プロパティID(有効無効制御有効終了日) */
	private static final String PROPERTY_YUKOMUKO_TO = "YUKOMUKO_TO";

	/** プロパティID(備考) */
	private static final String PROPERTY_BIKO = "BIKO";

	/** プロパティID(料金) */
	private static final String PROPERTY_PRC = "PRC";

	/** プロパティID(今すぐ視聴ボタン有効無効制御) */
	private static final String PROPERTY_IMASUGU_YUKOMUKO = "IMASUGU_YUKOMUKO";

	/** プロパティID(来月から視聴ボタン有効無効制御) */
	private static final String PROPERTY_RAIGETSU_YUKOMUKO = "RAIGETSU_YUKOMUKO";

	/** 画面ID(0PJP) */
	private static final String SCREEN_ID_OPJP = "0PJP";

	/** ハイフン */
	private static final String HYHUN = "-";

	/** 時分 */
	private static final String HHMM = "0000";

	/** プロパティセット */
	private static final String PROP_SET = "1";

	/** マスタ */
	private static final String MASTER_SET = "9";

	/** サービス契約 料金コースコード*/
	private static final String RTN_SVC_KEI_PCRSCD = "RTN_SVC_KEI_PCRSCD";

	/** 機器提供サービス契約一覧照会（eo光テレビ情報取得）マップ ※STB*/
	private static final String FUSV038003_S_C = "FUSV038003SC";

	/** 税込文言 */
	private static final String INCLUDING_TAX = "(税込)";

	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";
	/** プロパティファイル取得文字列 */
	private static final String PATH_GYOUMU_KISEI_COMMON = "DISPSETTING/SETTING[@screenId='#']/DISPTEXT[@groupid='GYOUMU_KISEI_COMMON']";
	/** プロパティファイル取得文字列 */
	private static final String PATH_GYOUMU_KISEI_FUW01501 = "DISPSETTING/SETTING[@screenId='FUW12401']/DISPTEXT[@groupid='GYOUMU_KISEI']";

	/** CCタイトル：異動予約取得コモンコンポーネント処理 */
	private static final String CC_TITLE_FUSV038001CC = "FUSV038001CC";
	/** 異動予約一覧 */
	private static final String OUT_IDO_RSV_SVC_KEI_UCWK_LIST = "ido_rsv_svc_kei_ucwk_list";
	
	/**
	 * マップに保持している業務規制コードをStringBufferで返す。
	 *
	 * <br>
	 * @param gyomuKiseiMap
	 * @return
	 * @throws Exception
	 */
	private StringBuffer getGyomuKisei(Map<String, String> gyomuKiseiMap)  throws Exception
	{
		Collection<String> gyomuKiseiCollection = gyomuKiseiMap.values();
		Iterator<String> itr = gyomuKiseiCollection.iterator();
		StringBuffer gyomuKiseiCd = new StringBuffer();
		while (itr.hasNext())
		{
			gyomuKiseiCd.append(itr.next());
		}

		return gyomuKiseiCd;
	}

	/**
	 * 業務規制情報を設定する。
	 * @return boolean true:規制中  false:規制中でない
	 */
	private void checkGyomuKisei() throws Exception
	{
		// 業務規制情報取得
		HashMap<String, Object> workKiseiInfoMap = JCCWebCommon.getBusinessControlMap(this);

		if (null != workKiseiInfoMap && 0 != workKiseiInfoMap.size())
		{
			// ●業務規制取得処理
			Map<String, String> gyomuKiseiMap = JFUWebCommon.getDispItemsAsMap(PATH_GYOUMU_KISEI_COMMON, QUERY_ATTR_NAME);
			Map<String, String> gyomuKiseiScreenIdMap = JFUWebCommon.getDispItemsAsMap(PATH_GYOUMU_KISEI_FUW01501, QUERY_ATTR_NAME);
			StringBuffer gyomuKiseiCd = new StringBuffer();
			gyomuKiseiCd = gyomuKiseiCd.append(getGyomuKisei(gyomuKiseiMap));
			gyomuKiseiCd = gyomuKiseiCd.append(JFUStrConst.COMMA);
			gyomuKiseiCd = gyomuKiseiCd.append(getGyomuKisei(gyomuKiseiScreenIdMap));

			String[] gyomuKiseiCdArray = gyomuKiseiCd.toString().split(JFUStrConst.COMMA);

			// 業務規制情報設定処理
			// 共有フォームBeanの取得
			X31SDataBeanAccess commonInfoBean = getCommonInfoBean();
			// 業務規制リスト取得
			X31SDataBeanAccess workKiseiListBean = getWorkKiseiList(commonInfoBean);

			for (int i = 0; i < gyomuKiseiCdArray.length; i++)
			{
				// 業務規制情報マップから、対象規制情報を取得
				HashMap<?, ?> workKiseiMap = (HashMap<?, ?>)workKiseiInfoMap.get(gyomuKiseiCdArray[i]);

				// 業務規制フラグの取得
				String kiseiFlg = (String)workKiseiMap.get(JFUStrConst.KISEI_FLG);

				// フロント稼動対象規制フラグを設定
				if (JFUStrConst.CD01306_1.equals(kiseiFlg))
				{
					workKiseiListBean.sendMessageString(CommonInfoCFConst.FRONT_KADO_TRGT_KISEI_FLG_48, X31CWebConst.DATABEAN_SET_VALUE,
							JFUStrConst.CD01306_1);
					String errorCd =   gyomuKiseiCdArray[i].toString().replace( JFUStrConst.S_SYSTEM_CD, JFUStrConst.EMPTY);
					// 規制フラグが"1"(規制中)の場合
					DEBUG_LOG.info("業務規制【メンテナンス中エラー】" + errorCd);
					// メンテナンス中エラー
					throw new JCCBusinessException(errorCd);
				}
			}
		}
	}

	/**
	 * フロント業務リスト
	 * @param commonInfoBean
	 * @return workKiseiListBean
	 */
	private X31SDataBeanAccess getWorkKiseiList(X31SDataBeanAccess commonInfoBean)
	{
		// フロント業務リストを取得
		X31SDataBeanAccessArray array = commonInfoBean.getDataBeanArray(CommonInfoCFConst.FRONT_WORK_INFO);
		if (array.getCount() == 0)
		{
			array.addDataBean();
		}
		X31SDataBeanAccess frontWorkListBean = array.getDataBean(0);

		return frontWorkListBean;
	}

	/**
	 * 初期処理を行います。
	 *
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start init -----");

		// 画面情報を取得し、サービスフォームBeanに設定
		JCCWebCommon.getScreenInfo(this);

		// 現顧客契約情報の最新化
		JFUWebCommon.refreshGenCustKei(this);

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// 料金コースコードチェック
		checkPrcCd(commonInfoBean);

		// 共通関連チェック
		JFUWebCommon.checkCommonRelation(this, FUSV_ID_FUSV0381);

// TODO: 選択後到達画面ＩＤ ※画面制御終了
		// 選択後到達画面ＩＤ クリア
		commonInfoBean.sendMessageString(CommonInfoCFConst.SELECT_TTU_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.EMPTY);

		// 業務規制チェック
		checkGyomuKisei();

		// C-CASカード番号の取得
		// ＳＳＯ情報の取得
		X31SDataBeanAccess ssoInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);

		// 共有フォームBeanのＳＳＯ情報.C-CASカード番号を取得しサービスフォームBeanに設定
		String kiki_seizo_no = JFUWebCommon.getDataBeanItemByPath(ssoInfo, CommonInfoCFConst.KIKI_SEIZO_NO_21);
		serviceFormBean.sendMessageString(FUW12401SFConst.KIKI_SEIZO_NO, X31CWebConst.DATABEAN_SET_VALUE, kiki_seizo_no);

		// サービスフォームBeanのC-CASカード番号をハイフン編集
		String kikiSeizoNoDisp = editKikiSeizoNo(serviceFormBean.sendMessageString(FUW12401SFConst.KIKI_SEIZO_NO, X31CWebConst.DATABEAN_GET_VALUE));

		// ハイフン編集したC-CASカード番号をサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW12401SFConst.KIKI_SEIZO_NO_DISP, X31CWebConst.DATABEAN_SET_VALUE, kikiSeizoNoDisp);

		// 契約状態チェック
		checkKeistatus(commonInfoBean, kiki_seizo_no);

		// URL直接遷移でオプションチャンネル指定がある場合、確認画面行きフラグをONにする
		String opsvccd = JFUWebCommon.getDataBeanItemByPath(ssoInfo, CommonInfoCFConst.OP_SVC_CD_21);
		String mskmdiv = JFUWebCommon.getDataBeanItemByPath(ssoInfo, CommonInfoCFConst.MSKM_KBN_21);
		boolean toCfmFlg = false;

		if ((!JFUWebCommon.isNull(opsvccd)) & (!JFUWebCommon.isNull(mskmdiv)))
		{
			toCfmFlg = true;
		}

		// オプションサービスコード
		serviceFormBean.sendMessageString(FUW12401SFConst.OP_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, opsvccd);
		// 申込区分
		serviceFormBean.sendMessageString(FUW12401SFConst.MSKM_DIV, X31CWebConst.DATABEAN_SET_VALUE, mskmdiv);

		// オンライン運用日付を取得
		String opeDate = JCCWebCommon.getOpeDate(this, null);
		String opeDateTime = JCCWebCommon.getOpeDateTime(this, null);

		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, FUSV_ID_FUSV0380);

		// DataBean-BPマッピング
		FUSV0380_FUSV0380OPDBMapper mapper = new FUSV0380_FUSV0380OPDBMapper();

		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		HashMap outputMap = new HashMap();

		X31SDataBeanAccess[] paramBean = { serviceFormBean, commonInfoBean };
		mapper.setFUSV038001SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV038001CC(paramBean, inputMap);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 業務共通例外クラス："0002"（システムエラー）
			DEBUG_LOG.info("■■■FUW12401 (1)サービスIF実行エラー ■■■");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		X31SDataBeanAccess[] paramBeanOut = { serviceFormBean };

		mapper.getFUSV038001SC(paramBeanOut, outputMap);

		// 機器機種変更中の予約中の場合は、エラーにする。
		chkKikiMdlChgRsvcv(outputMap);

		// STB機器の契約状態判定
		Map<String, String> resultMap = checkTvMskmAvailable(outputMap);

		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelList = serviceFormBean.getDataBeanArray(FUW12401SFConst.OP_CHANNEL_LIST);

		//料金コースコード
		String svcKeiUcwkPcrsCd = resultMap.get(RTN_SVC_KEI_PCRSCD);

		// オプションチャンネルリスト表示値の設定
		setBeanChannelList(svcKeiUcwkPcrsCd, opChannelList, opeDate, opeDateTime);

		// URL直接遷移の場合(かつ、オプションチャンネル指定ありの場合)
		if (!JFUScreenConst.SCREEN_ID_FUW09501.equals(serviceFormBean.sendMessageString(FUW12401SFConst.MOTO_SCREEN_ID,
				X31CWebConst.DATABEAN_GET_VALUE)) & toCfmFlg)
		{
			// チャンネルリスト生成
			List<X31SDataBeanAccess> channelList = createChannelList(opChannelList, JFUStrConst.EMPTY);

			// オプションサービスチェック(存在チェック、契約状態チェック)
			chkOpSvc(serviceFormBean, channelList);

			// 引き継ぎ情報dataMap作成
			HashMap<String, Object> dataMap = createChannelDataMap(serviceFormBean, channelList);

			// 引継ぎ情報を設定する。
			JCCWebCommon.setScreenInfo(this, JFUScreenConst.SCREEN_ID_FUW12402, dataMap);

			// eo光テレビオプションチャンネル追加確認画面へ遷移
			// 遷移先画面IDを設定
			setTransferPageId(JFUScreenConst.SCREEN_ID_FUW12402 + SCREEN_ID_OPJP);
			commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW12402);
			commonInfoBean
					.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW12402);
		}

		// メニューから遷移の場合、またはURL直接遷移(オプションチャンネル指定なし)
		else
		{
			// eo光テレビオプションチャンネル追加画面へ遷移
			// 遷移先画面IDを設定
			commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW12401);
			// 遷移先画面名を設定
			commonInfoBean
					.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW12401);
		}

		DEBUG_LOG.info("----- FUW12401 End init -----");

		
		// 運用日付の設定
		setFuOpedate(commonInfoBean, JFUWebCommon.getOpeDate(this, null));
		
		return true;
	}

	/**
	 * 今すぐ視聴ボタン押下処理を行います。
	 *
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean watchImaSugu() throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start watchImaSugu -----");

		// 視聴ボタン押下時処理実行
		watchMskm();

		DEBUG_LOG.info("----- FUW12401 End watchImaSugu -----");

		return true;
	}

	/**
	 * 来月から視聴ボタン押下処理を行います。
	 *
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean watchRaigetsuFrom() throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start watchRaigetsuFrom -----");

		// 視聴ボタン押下時処理実行
		watchMskm();

		DEBUG_LOG.info("----- FUW12401 End watchRaigetsuFrom -----");

		return true;
	}

	/**
	 * 視聴ボタン押下時処理を行います。
	 *
	 * @throws Exception 例外
	 */
	private void watchMskm() throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start watchMskm -----");

		// 現顧客契約情報の最新化
		JFUWebCommon.refreshGenCustKei(this);

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelList = serviceFormBean.getDataBeanArray(FUW12401SFConst.OP_CHANNEL_LIST);

		// 共通関連チェック
		JFUWebCommon.checkCommonRelation(this, FUSV_ID_FUSV0381);

		// C-CASカード番号
		String kiki_seizo_no = serviceFormBean.sendMessageString(FUW12401SFConst.KIKI_SEIZO_NO, X31CWebConst.DATABEAN_GET_VALUE);

		// 契約状態チェック
		checkKeistatus(commonInfoBean, kiki_seizo_no);

		// チャンネルリスト生成
		List<X31SDataBeanAccess> channelList =
				createChannelList(opChannelList, serviceFormBean.sendMessageString(FUW12401SFConst.OP_CHANNEL_SBT_CD,
						X31CWebConst.DATABEAN_GET_VALUE));

		// 申込対象チャンネル情報取得
		X31SDataBeanAccess channelBean =
				channelList.get(Integer.parseInt(serviceFormBean.sendMessageString(FUW12401SFConst.CHOICE_NO, X31CWebConst.DATABEAN_GET_VALUE)));

		// 引き継ぎ情報dataMap作成
		HashMap<String, Object> dataMap = createDataMap(serviceFormBean, channelBean);

		// 引継ぎ情報を設定する。
		JCCWebCommon.setScreenInfo(this, JFUScreenConst.SCREEN_ID_FUW12402, dataMap);

		// 子画面に親画面の画面IDを設定
		JCCWebCommon.setScreenId(this, JFUScreenConst.SCREEN_ID_FUW12402, JFUScreenConst.SCREEN_ID_FUW12401);

		// eo光テレビオプションチャンネル追加確認画面へ遷移
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW12402);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW12402);

		DEBUG_LOG.info("----- FUW12401 End watchMskm -----");
	}

	/**
	 * チャンネルリスト表示値設定処理を行います。
	 *
	 * @param pcrsCd		サービス契約の料金コースコード
	 * @param channelList	データBeanリストアクセスクラス
	 * @param date			日付
	 * @param dateYmdhm	日付(YYYYMMDDhhmm)
	 * @throws Exception	例外
	 */
	private void setBeanChannelList(String pcrsCd, X31SDataBeanAccessArray channelList, String date, String dateYmdhm) throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start setBeanChannelList -----");

		// チャンネルリストに表示値を設定する
		for (int i = 0; i < channelList.getCount(); ++i)
		{

			// チャンネル情報を取得
			X31SDataBeanAccess channelBean = channelList.getDataBean(i);

			//オプションサービスコード
			String opSvcCd = channelBean.sendMessageString(FUW12401SFConst.OP_SVC_CD_01, X31CWebConst.DATABEAN_GET_VALUE);

			// サービスフォームBeanの月額料金に料金プラン固定金額 + 単位を設定(初期値)
			// 税抜き金額を設定
			String pplanKoteiAmntNextMStr =
					channelBean.sendMessageString(FUW12401SFConst.PPLAN_KOTEI_AMNT_NEXT_M_01,
							X31CWebConst.DATABEAN_GET_VALUE);
			channelBean.sendMessageString(FUW12401SFConst.PRC_01, X31CWebConst.DATABEAN_SET_VALUE, JPCUtilCommon.formatNumber(pplanKoteiAmntNextMStr)
					+ channelBean.sendMessageString(FUW12401SFConst.PPLAN_KOTEI_TANI_CD_NM_NEXT_M_01, X31CWebConst.DATABEAN_GET_VALUE));

			// 月額料金の設定元(初期値：マスタ)
			channelBean.sendMessageString(FUW12401SFConst.PRC_KIND_CD_01, X31CWebConst.DATABEAN_SET_VALUE, MASTER_SET);

			// オプションサービス備考の設定
			if (!chkDispBiko(channelBean, date))
			{
				// オプションサービス備考に""(空白)を設定
				channelBean.sendMessageString(FUW12401SFConst.BIKO_01, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.EMPTY);
			}

			/* ++++++++++ v3.00 修正開始 ++++++++++ */
			// ----------------------------------------------------
			// 契約中表示フラグの設定
			// ----------------------------------------------------
			// オプションサービス契約ステータスが210(休止・中断中)
			// または、オプションサービス契約ステータスが220(停止中)
			// または、オプションサービス契約ステータスが100(サービス提供中)かつ、予約適用年月日がオンライン運用日付以前
			if (JFUStrConst.CD00037_210.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE))
					|| JFUStrConst.CD00037_220.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01,
							X31CWebConst.DATABEAN_GET_VALUE))
					|| (JFUStrConst.CD00037_100.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01,
							X31CWebConst.DATABEAN_GET_VALUE)) && JPCUtilCommon.isFutureDate(date, channelBean.sendMessageString(
							FUW12401SFConst.RSV_APLY_YMD_01, X31CWebConst.DATABEAN_GET_VALUE), DOJITSU_HUKUMU)))
			{
				// 契約中表示フラグに"1"(表示)を設定
				channelBean.sendMessageString(FUW12401SFConst.KEI_CHU_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_ON);
			}
			else
			{
				// 契約中表示フラグに"0"(非表示)を設定
				channelBean.sendMessageString(FUW12401SFConst.KEI_CHU_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);
			}
			/* ++++++++++ v3.00 修正終了 ++++++++++ */
			// 契約不可表示フラグを設定
			// オプションサービス解約対象フラグが"1"(抽出対象)の場合、"契約できません" を表示
			if ( OPCH_DSL_TG_CHSHT_FLG_TG.equals(channelBean.sendMessageString(FUW12401SFConst.OPCH_DSL_TG_CHSHT_FLG_01,
					X31CWebConst.DATABEAN_GET_VALUE))){
				// "1"表示
				channelBean.sendMessageString(FUW12401SFConst.KEIFUKA_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_ON);
			} else {
				// "0"非表示
				channelBean.sendMessageString(FUW12401SFConst.KEIFUKA_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);
			}

			// ----------------------------------------------------
			// 契約手続き中表示フラグの設定
			// ----------------------------------------------------
			// オプションサービス契約ステータスが010(受付済)
			// または、オプションサービス契約ステータスが020(照査済)
			// または、オプションサービス契約ステータスが030(締結済)
			// または、オプションサービス契約ステータスが100(サービス提供中)かつ、予約適用年月日がオンライン運用日付より未来日の場合
			if (JFUStrConst.CD00037_010.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE))
					|| JFUStrConst.CD00037_020.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01,
							X31CWebConst.DATABEAN_GET_VALUE))
					|| JFUStrConst.CD00037_030.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01,
							X31CWebConst.DATABEAN_GET_VALUE))
					|| (JFUStrConst.CD00037_100.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01,
							X31CWebConst.DATABEAN_GET_VALUE)) && JPCUtilCommon.isPastDate(date, channelBean.sendMessageString(
							FUW12401SFConst.RSV_APLY_YMD_01, X31CWebConst.DATABEAN_GET_VALUE), DOJITSU_HUKUMANAI)))
			{
				// 契約手続き中表示フラグに"1"(表示)を設定
				channelBean.sendMessageString(FUW12401SFConst.KEI_TTDKEI_CHU_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_ON);
			}
			else
			{
				// 契約手続き中表示フラグに"0"(非表示)を設定
				channelBean.sendMessageString(FUW12401SFConst.KEI_TTDKEI_CHU_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);
			}

			/* ++++++++++ v3.00 修正開始 ++++++++++ */
			// ----------------------------------------------------
			// 未契約表示フラグ、今すぐ視聴ボタン表示フラグの設定
			// ----------------------------------------------------
			// 今すぐ視聴ボタン表示フラグに"0"(非表示)を設定
			channelBean.sendMessageString(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);

			// オプションサービス解約対象フラグが"1"(抽出対象)以外の場合
			if (!OPCH_DSL_TG_CHSHT_FLG_TG.equals(channelBean.sendMessageString(FUW12401SFConst.OPCH_DSL_TG_CHSHT_FLG_01,
					X31CWebConst.DATABEAN_GET_VALUE)))
			{
				// オプションサービス契約ステータスが空白(未契約)の場合
				if (JFUStrConst.EMPTY.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE)))
				{
					// 今すぐ視聴ボタン表示フラグに"1"(表示)を設定
					channelBean.sendMessageString(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_ON);
				}
			}

			// ----------------------------------------------------
			// 来月から視聴ボタン表示フラグの設定
			// ----------------------------------------------------

			// 来月から視聴ボタン表示フラグに"0"(非表示)を設定
			channelBean.sendMessageString(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);

			// オプションサービス解約対象フラグが"1"(抽出対象)以外の場合
			if (!OPCH_DSL_TG_CHSHT_FLG_TG.equals(channelBean.sendMessageString(FUW12401SFConst.OPCH_DSL_TG_CHSHT_FLG_01,
					X31CWebConst.DATABEAN_GET_VALUE)))
			{

				if (JFUStrConst.EMPTY.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE)))
				{
					// オプションサービス契約ステータスが空白(未契約)

					// 来月から視聴ボタン表示フラグに"1"(表示)を設定
					channelBean.sendMessageString(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_ON);
				}
				else if(JFUStrConst.CD00037_910.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01,
								X31CWebConst.DATABEAN_GET_VALUE)) && JPCUtilCommon.isPastDate(date, channelBean.sendMessageString(
								FUW12401SFConst.RSV_APLY_YMD_01, X31CWebConst.DATABEAN_GET_VALUE), DOJITSU_HUKUMU))
				{
					// オプションサービス契約ステータスが910(解約済)かつ、予約適用年月日がオンライン運用日付以降の場合

					// 来月から視聴ボタン表示フラグに"0"(非表示)を設定
					channelBean.sendMessageString(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);
				}
			}

			/* ++++++++++ v3.00 修正終了 ++++++++++ */

			// ----------------------------------------------------
			// プロパティ設定情報反映
			// ----------------------------------------------------
			Map<String, String> propInfo = new HashMap<String, String>();
			setPropertyInfo(channelBean, pcrsCd, opSvcCd, date, propInfo);

			// ----------------------------------------------------
			// オプションチャンネル登録画面表示対象フラグから
			// 未契約表示フラグ、今すぐ視聴ボタン表示フラグの設定
			// ----------------------------------------------------
			// 今すぐ視聴ボタン表示フラグに"0"(非表示)を設定
			String ukStaYmdhm = channelBean.sendMessageString(FUW12401SFConst.UK_STA_YMDHM_01, X31CWebConst.DATABEAN_GET_VALUE);
			String ukEndYmdhm = channelBean.sendMessageString(FUW12401SFConst.UK_END_YMDHM_01, X31CWebConst.DATABEAN_GET_VALUE);
			String nextMonthYmdhm = JFUCommonUtil.getBeginOfNextMonthDate(date) + HHMM;

			// プロパティからの設定無し
			if (!propInfo.containsKey(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01))
			{
				// 今すぐ視聴ボタン表示フラグに"0"(非表示)を設定
				channelBean.sendMessageString(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);
				// オプションチャンネル登録画面表示対象フラグが<>"0"(非表示)
				// オプションサービス解約対象フラグが<>"1"(抽出対象)以外
				// 受付開始年月日時分≦運用日付≦受付終了年月日時分
				if ((!JFUStrConst.KK0811_OPCH_ADD_SCREEN_DSP_TG_FLG_0.equals(channelBean.sendMessageString(
						FUW12401SFConst.OPCH_ADD_SCREEN_DSP_TG_FLG_01, X31CWebConst.DATABEAN_GET_VALUE)))
						&& (!OPCH_DSL_TG_CHSHT_FLG_TG.equals(channelBean.sendMessageString(FUW12401SFConst.OPCH_DSL_TG_CHSHT_FLG_01,
								X31CWebConst.DATABEAN_GET_VALUE)))
						&& (dateYmdhm.compareTo(ukStaYmdhm) >= 0)
						&& (ukEndYmdhm.compareTo(dateYmdhm) >= 0))
				{
					// オプションサービス契約ステータスが空白(未契約)の場合
					if (JFUStrConst.EMPTY.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE)))
					{
						// 今すぐ視聴ボタン表示フラグに"1"(表示)を設定
						channelBean.sendMessageString(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_ON);
					}
				}
			}

			// プロパティからの設定無し
			if (!propInfo.containsKey(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01))
			{
				// 今すぐ視聴ボタン表示フラグに"0"(非表示)を設定
				channelBean.sendMessageString(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);
				// オプションチャンネル登録画面表示対象フラグが<>"0"(非表示)
				// オプションサービス解約対象フラグが<>"1"(抽出対象)以外
				// 受付開始年月日時分≦運用日付の翌月≦受付終了年月日時分
				if ((!JFUStrConst.KK0811_OPCH_ADD_SCREEN_DSP_TG_FLG_0.equals(channelBean.sendMessageString(
						FUW12401SFConst.OPCH_ADD_SCREEN_DSP_TG_FLG_01, X31CWebConst.DATABEAN_GET_VALUE)))
						&& (!OPCH_DSL_TG_CHSHT_FLG_TG.equals(channelBean.sendMessageString(FUW12401SFConst.OPCH_DSL_TG_CHSHT_FLG_01,
								X31CWebConst.DATABEAN_GET_VALUE)))
						&& (nextMonthYmdhm.compareTo(ukStaYmdhm) >= 0)
						&& (ukEndYmdhm.compareTo(nextMonthYmdhm) >= 0))
				{

					if (JFUStrConst.EMPTY.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE)))
					{
						// オプションサービス契約ステータスが空白(未契約)

						// 来月から視聴ボタン表示フラグに"1"(表示)を設定
						channelBean.sendMessageString(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_ON);
					} else if (JFUStrConst.CD00037_910.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01,
									X31CWebConst.DATABEAN_GET_VALUE)) && JPCUtilCommon.isPastDate(date, channelBean.sendMessageString(
									FUW12401SFConst.RSV_APLY_YMD_01, X31CWebConst.DATABEAN_GET_VALUE), DOJITSU_HUKUMU)){
						// オプションサービス契約ステータスが910(解約済)かつ、予約適用年月日がオンライン運用日付以降の場合

						// 来月から視聴ボタン表示フラグに"0"(非表示)を設定
						channelBean.sendMessageString(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);
					}
				}
			}

			// 月額料金がプロパティから設定されている場合
			if (propInfo.containsKey(FUW12401SFConst.PPLAN_KOTEI_AMNT_01))
			{
				channelBean.sendMessageString(FUW12401SFConst.PRC_KIND_CD_01, X31CWebConst.DATABEAN_SET_VALUE, PROP_SET);
			}

			// << "未契約"表示判定 >>
			String imasuguWatch = channelBean.sendMessageString(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_GET_VALUE);
			String raigetsuWatch = channelBean.sendMessageString(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_GET_VALUE);
			// 「契約中」「契約できません」「手続き中」
			String keiChu = channelBean.sendMessageString(FUW12401SFConst.KEI_CHU_DSP_FLG_01, X31CWebConst.DATABEAN_GET_VALUE);
			String keiFuka = channelBean.sendMessageString(FUW12401SFConst.KEIFUKA_DSP_FLG_01, X31CWebConst.DATABEAN_GET_VALUE);
			String keiTtdkeiChu = channelBean.sendMessageString(FUW12401SFConst.KEI_TTDKEI_CHU_DSP_FLG_01, X31CWebConst.DATABEAN_GET_VALUE);

			if (DISP_FLG_ON.equals(imasuguWatch) || DISP_FLG_ON.equals(raigetsuWatch)){
				// 「今すぐ視聴」、「来月から視聴」ボタンのどちらかが使用可能の場合は"未契約"を表示しない
				channelBean.sendMessageString(FUW12401SFConst.MIKEI_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);
			} else if (DISP_FLG_OFF.equals(keiChu) && DISP_FLG_OFF.equals(keiFuka) && DISP_FLG_OFF.equals(keiTtdkeiChu)){
				// 「契約中」「契約できません」「手続き中」以外の場合は、"未契約"を表示する
				channelBean.sendMessageString(FUW12401SFConst.MIKEI_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_ON);
			}

			DEBUG_LOG.info("----- FUW12401 End setBeanChannelList -----");
		}
	}

	/**
	 * 備考出力判定処理を行います。
	 *
	 * @param channelBean	データBeanアクセスクラス
	 * @param date			日付
	 * @return 判定結果	true:出力する false：出力しない
	 * @throws Exception	例外
	 */
	private Boolean chkDispBiko(X31SDataBeanAccess channelBean, String date) throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start chkDispBiko -----");

		// オプションサービス備考の設定
		// 備考画面表示開始年月日が""(空白)以外
		// または、備考画面表示終了年月日が""(空白)以外
		if (!JFUStrConst.EMPTY.equals(channelBean.sendMessageString(FUW12401SFConst.BIKO_SCREEN_DSP_STAYMD_01, X31CWebConst.DATABEAN_GET_VALUE))
				&& !JFUStrConst.EMPTY.equals(channelBean
						.sendMessageString(FUW12401SFConst.BIKO_SCREEN_DSP_ENDYMD_01, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// 備考画面表示開始年月日がオンライン運用日付以前、
			// かつ 備考画面表示終了年月日がオンライン運用日付以降の場合
			if (JPCUtilCommon.isFutureDate(date, channelBean.sendMessageString(FUW12401SFConst.BIKO_SCREEN_DSP_STAYMD_01,
					X31CWebConst.DATABEAN_GET_VALUE), DOJITSU_HUKUMU)
					&& JPCUtilCommon.isPastDate(date, channelBean.sendMessageString(FUW12401SFConst.BIKO_SCREEN_DSP_ENDYMD_01,
							X31CWebConst.DATABEAN_GET_VALUE), DOJITSU_HUKUMU))
			{
				return true;
			}
		}

		DEBUG_LOG.info("----- FUW12401 End chkDispBiko -----");

		return false;
	}

	/**
	 * プロパティ情報設定処理を行います。
	 *
	 * @param channelBean	データBeanアクセスクラス
	 * @param pcrsCd		料金コースコード
	 * @param opSvcCd		オプションサービスコード
	 * @param date			日付
	 * @param propInfo		プロパティからの制御結果
	 * @throws Exception	例外
	 */
	private void setPropertyInfo(X31SDataBeanAccess channelBean, String pcrsCd, String opSvcCd, String date, Map<String, String> propInfo)
			throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start setPropertyInfo -----");

		// プロパティファイルより表示用文字列を取得
		Map<String, String> dispMap =
				JFUWebCommon.getDispItemsAsMap(GET_DISP_MAP_SET_QUERY_TEXT + pcrsCd + JFUStrConst.COMMA + opSvcCd + GET_DISP_MAP_SET_QUERY_END,
						GET_DISP_MAP_SET_ZOKUSEI);

		// プロパティファイルより制御用文字列を取得
		Map<String, String> ctlMap =
				JFUWebCommon.getDispItemsAsMap(GET_DISP_MAP_SET_QUERY_CTL + pcrsCd + JFUStrConst.COMMA + opSvcCd + GET_DISP_MAP_SET_QUERY_END,
						GET_DISP_MAP_SET_ZOKUSEI);

		// 日付がプロパティの有効無効有効開始日、有効無効有効終了日に設定されている場合
		if (ctlMap.get(PROPERTY_YUKOMUKO_FROM) != null && !JFUStrConst.EMPTY.equals(ctlMap.get(PROPERTY_YUKOMUKO_FROM))
				&& ctlMap.get(PROPERTY_YUKOMUKO_TO) != null && !JFUStrConst.EMPTY.equals(ctlMap.get(PROPERTY_YUKOMUKO_FROM)))
		{
			// 日付がプロパティの有効無効有効開始日から有効無効有効終了日の間の場合
			if (JPCUtilCommon.isFutureDate(date, ctlMap.get(PROPERTY_YUKOMUKO_FROM), DOJITSU_HUKUMU)
					&& JPCUtilCommon.isPastDate(date, ctlMap.get(PROPERTY_YUKOMUKO_TO), DOJITSU_HUKUMU))
			{

				// 今すぐ視聴ボタン表示フラグの設定
				// オプションサービス契約ステータスが空白の場合
				if (JFUStrConst.EMPTY.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE)))
				{

					// 今すぐ視聴ボタン表示フラグの設定
					if (DISP_FLG_ON.equals(channelBean.sendMessageString(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01,
							X31CWebConst.DATABEAN_GET_VALUE))
							&& YUKO_FLG_OFF.equals(ctlMap.get(PROPERTY_IMASUGU_YUKOMUKO)))
					{

						// 今すぐ視聴ボタン表示フラグに"0"(非表示)を設定
						channelBean.sendMessageString(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);
						propInfo.put(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01, DISP_FLG_OFF);
					}
					else
					{
						propInfo.put(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01, DISP_FLG_ON);
					}
				}

				// 来月から視聴ボタン表示フラグの設定
				// オプションサービス契約ステータスが空白
				// または、オプションサービス契約ステータスが910(解約済)かつ、予約適用年月日がオンライン運用日付以降の場合
				if (JFUStrConst.EMPTY.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE))
						|| (JFUStrConst.CD00037_910.equals(channelBean.sendMessageString(FUW12401SFConst.OP_SVC_KEI_STAT_01,
								X31CWebConst.DATABEAN_GET_VALUE)) && JPCUtilCommon.isPastDate(date, channelBean.sendMessageString(
								FUW12401SFConst.RSV_APLY_YMD_01, X31CWebConst.DATABEAN_GET_VALUE), DOJITSU_HUKUMU)))
				{
					// 来月から視聴ボタン表示フラグの設定
					if (DISP_FLG_ON.equals(channelBean.sendMessageString(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01,
							X31CWebConst.DATABEAN_GET_VALUE))
							&& YUKO_FLG_OFF.equals(ctlMap.get(PROPERTY_RAIGETSU_YUKOMUKO)))
					{

						// 来月から視聴ボタン表示フラグに"0"(非表示)を設定
						channelBean.sendMessageString(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_SET_VALUE, DISP_FLG_OFF);
						propInfo.put(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, DISP_FLG_OFF);
					}
					else
					{
						propInfo.put(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, DISP_FLG_ON);
					}
				}
			}
		}

		// 日付がプロパティの備考有効開始日、備考有効終了日に設定されている場合
		if (ctlMap.get(PROPERTY_BIKO_FROM) != null && !JFUStrConst.EMPTY.equals(ctlMap.get(PROPERTY_BIKO_FROM))
				&& ctlMap.get(PROPERTY_BIKO_TO) != null && !JFUStrConst.EMPTY.equals(ctlMap.get(PROPERTY_BIKO_TO)))
		{
			// 日付がプロパティの備考有効開始日から備考有効終了日の間の場合
			if (JPCUtilCommon.isFutureDate(date, ctlMap.get(PROPERTY_BIKO_FROM), DOJITSU_HUKUMU)
					&& JPCUtilCommon.isPastDate(date, ctlMap.get(PROPERTY_BIKO_TO), DOJITSU_HUKUMU))
			{
				// 備考の設定
				if (!JFUStrConst.EMPTY.equals(dispMap.get(PROPERTY_BIKO)))
				{
					// サービスフォームBeanの備考にプロパティの備考を設定
					channelBean.sendMessageString(FUW12401SFConst.BIKO_01, X31CWebConst.DATABEAN_SET_VALUE, dispMap.get(PROPERTY_BIKO));
					propInfo.put(FUW12401SFConst.BIKO_01, DISP_FLG_ON);
				}
			}
		}

		// 日付がプロパティの料金有効開始日、料金有効終了日に設定されている場合
		if (ctlMap.get(PROPERTY_PRC_FROM) != null && !JFUStrConst.EMPTY.equals(ctlMap.get(PROPERTY_PRC_FROM)) && ctlMap.get(PROPERTY_PRC_TO) != null
				&& !JFUStrConst.EMPTY.equals(ctlMap.get(PROPERTY_PRC_TO)))
		{
			// 日付がプロパティの料金有効開始日から料金有効終了日の間の場合
			if (JPCUtilCommon.isFutureDate(date, ctlMap.get(PROPERTY_PRC_FROM), DOJITSU_HUKUMU)
					&& JPCUtilCommon.isPastDate(date, ctlMap.get(PROPERTY_PRC_TO), DOJITSU_HUKUMU))
			{
				// 料金プラン固定金額の設定
				if (!JFUStrConst.EMPTY.equals(dispMap.get(PROPERTY_PRC)))
				{
					// サービスフォームBeanの料金プラン固定金額にプロパティの料金を設定（数値はフォーマット済。文言の場合あり）
					channelBean.sendMessageString(FUW12401SFConst.PRC_01, X31CWebConst.DATABEAN_SET_VALUE, dispMap.get(PROPERTY_PRC));
					propInfo.put(FUW12401SFConst.PPLAN_KOTEI_AMNT_01, DISP_FLG_ON);
				}
			}
		}

		DEBUG_LOG.info("----- FUW12401 End setPropertyInfo -----");
	}

	/**
	 * チャンネルリスト生成処理を行います。
	 *
	 * @param opChannelList			データBeanリストアクセスクラス(オプションチャンネルリスト)
	 * @param opChannelSbtCd		オプションチャンネル種別コード
	 * @return channelList			オプションチャンネルリスト
	 * @throws Exception			例外
	 * 	 */
	private List<X31SDataBeanAccess> createChannelList(X31SDataBeanAccessArray opChannelList,
			String opChannelSbtCd) throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start createChannelList -----");

		List<X31SDataBeanAccess> channelList = new ArrayList<X31SDataBeanAccess>();

		// オプションチャンネル種別コードが01(通常チャンネル)の場合、またはnullの場合
		if (JFUStrConst.CD00791_01.equals(opChannelSbtCd) || opChannelSbtCd.length() == 0)
		{
			// オプションチャンネルリストをチャンネルリストに設定
			for (int i = 0; i < opChannelList.getCount(); ++i)
			{
				// チャンネル情報を取得
				X31SDataBeanAccess channelBean = opChannelList.getDataBean(i);
				channelList.add(channelBean);
			}
		}

		DEBUG_LOG.info("----- FUW12401 End createChannelList -----");

		return channelList;
	}

	/**
	 * オプションサービスコードチェック処理を行います。
	 *
	 * @param serviceFormBean	データBeanアクセスクラス
	 * @param channelList		データBeanリストアクセスクラス
	 * @throws Exception		例外
	 * 	 */
	private void chkOpSvc(X31SDataBeanAccess serviceFormBean, List<X31SDataBeanAccess> channelList) throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start chkOpSvc -----");

		// オプションサービスコード取得
		String opSvcCd = serviceFormBean.sendMessageString(FUW12401SFConst.OP_SVC_CD, X31CWebConst.DATABEAN_GET_VALUE);
		// 申込区分取得
		String mskmDiv = serviceFormBean.sendMessageString(FUW12401SFConst.MSKM_DIV, X31CWebConst.DATABEAN_GET_VALUE);

		// オプションサービスコード存在チェックフラグ
		boolean chkOpSvcCdFlg = false;
		String imasuguFlg = null;
		String raigetsuFlg = null;

		// チャンネルリストをループ
		for (int i = 0; i < channelList.size(); ++i)
		{
			// チャンネル情報を取得
			X31SDataBeanAccess channelBean = channelList.get(i);

			// チャンネル情報のオプションサービスコードと申込対象のオプションサービスコードが同じ場合
			if (channelBean.sendMessageString(FUW12401SFConst.OP_SVC_CD_01, X31CWebConst.DATABEAN_GET_VALUE).equals(opSvcCd))
			{
				// オプションサービスコード存在チェックフラグにtrueを設定
				chkOpSvcCdFlg = true;

				// 今すぐ視聴ボタン表示フラグ取得
				imasuguFlg = channelBean.sendMessageString(FUW12401SFConst.IMASUGU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_GET_VALUE);
				// 来月から視聴ボタン表示フラグ取得
				raigetsuFlg = channelBean.sendMessageString(FUW12401SFConst.RAIGETSU_WATCH_BTN_DSP_FLG_01, X31CWebConst.DATABEAN_GET_VALUE);

				break;
			}
		}

		// オプションサービスコード存在チェック
		if (!chkOpSvcCdFlg)
		{
			// 業務共通例外クラス："0002"（システムエラー）
			DEBUG_LOG.info("■■■FUW12401 (3)オプションサービスコード存在チェックエラー(システムエラー)( オプションサービスコード：" + chkOpSvcCdFlg + ")");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// 申込区分チェック
		if (!(MSKM_DIV_IMASUGU.equals(mskmDiv) || MSKM_DIV_RAIGETSU.equals(mskmDiv)))
		{
			// 業務共通例外クラス："0002"（システムエラー）
			DEBUG_LOG.info("■■■FUW12401 (5)申込区分不正( 申込区分：" + mskmDiv + ")");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// オプションサービス契約状態
		if (MSKM_DIV_IMASUGU.equals(mskmDiv) && DISP_FLG_OFF.equals(imasuguFlg) || MSKM_DIV_RAIGETSU.equals(mskmDiv)
				&& DISP_FLG_OFF.equals(raigetsuFlg))
		{
			// 業務共通例外クラス："0201"（お客様情報変更エラー）
			DEBUG_LOG.info("■■■FUW12401 (4)オプションサービス契約状態チェックエラー(お客様情報変更エラー)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0201);
		}

		DEBUG_LOG.info("----- FUW12401 End chkOpSvc -----");
	}


	/**
	 * テレビ関連の申し込み可否チェック処理
	 *
	 * @param outputMap 検索結果格納用マップ
	 * @return 処理結果
	 * @throws Exception
	 * */
	@SuppressWarnings("unchecked")
	private Map<String, String> checkTvMskmAvailable(HashMap outputMap) throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start checkTvMskmAvailable -----");

		// テレビ関連の申し込み可否チェック処理(申し込めない状態の場合、部品内でthrows)
		Map<String, String> resultMap =
				JFUWebCommon.checkTvMskmAvailable(this, JFUScreenConst.SCREEN_ID_FUW12401,
						(HashMap)outputMap.get(FUSV038003_S_C), null);
		DEBUG_LOG.info("----- FUW12401 End checkTvMskmAvailable -----");

		return resultMap;
	}

	/**
	 * 引き継ぎ情報データマップ作成処理を行います。
	 *
	 * @param serviceFormBean	データBeanアクセスクラス
	 * @param channelList		チャンネルリスト
	 * @return dataMap			引き継ぎ情報データマップ
	 * @throws Exception		例外
	 * 	 */
	private HashMap<String, Object> createChannelDataMap(X31SDataBeanAccess serviceFormBean, List<X31SDataBeanAccess> channelList) throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start createChannelDataMap -----");

		HashMap<String, Object> dataMap = null;

		// 申込対象のオプションサービスコードを取得
		String mskmOpSvcCd = serviceFormBean.sendMessageString(FUW12401SFConst.OP_SVC_CD, X31CWebConst.DATABEAN_GET_VALUE);

		// チャンネルリストをループ
		for (int i = 0; i < channelList.size(); ++i)
		{
			// チャンネル情報を取得
			X31SDataBeanAccess channelBean = channelList.get(i);

			// チャンネル情報のオプションサービスコードと申込対象のオプションサービスコードが同じ場合
			if (channelBean.sendMessageString(FUW12401SFConst.OP_SVC_CD_01, X31CWebConst.DATABEAN_GET_VALUE).equals(mskmOpSvcCd))
			{
				// 引き継ぎ情報データマップ作成
				dataMap = createDataMap(serviceFormBean, channelBean);
				break;
			}
		}

		DEBUG_LOG.info("----- FUW12401 End createChannelDataMap -----");

		return dataMap;
	}

	/**
	 * データマップ作成処理を行います。
	 *
	 * @param serviceFormBean	データBeanアクセスクラス(サービスフォームBean)
	 * @param channelBean		データBeanアクセスクラス(チャンネル情報)
	 * @return dataMap			引き継ぎ情報データマップ
	 * @throws Exception		例外
	 * 	 */
	private HashMap<String, Object> createDataMap(X31SDataBeanAccess serviceFormBean, X31SDataBeanAccess channelBean) throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start createDataMap -----");

		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		String mskmDiv = serviceFormBean.sendMessageString(FUW12401SFConst.MSKM_DIV, X31CWebConst.DATABEAN_GET_VALUE); // 申込区分

		// ■サービスフォームBeanの情報をデータマップに設定
		// 遷移元画面ID設定
		dataMap.put(FUW12402SFConst.MOTO_SCREEN_ID, serviceFormBean
				.sendMessageString(FUW12401SFConst.MOTO_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE));

		// C-CASカード番号
		dataMap.put(FUW12402SFConst.KIKI_SEIZO_NO_CCAS, serviceFormBean.sendMessageString(FUW12401SFConst.KIKI_SEIZO_NO,
				X31CWebConst.DATABEAN_GET_VALUE));

		// 申込区分
		dataMap.put(FUW12402SFConst.MSKM_DIV, mskmDiv);

		// オプションサービスコード
		dataMap.put(FUW12402SFConst.OP_SVC_CD, serviceFormBean.sendMessageString(FUW12401SFConst.OP_SVC_CD, X31CWebConst.DATABEAN_GET_VALUE));

		// ■チャンネルリストから取得した情報をデータマップに設定
		// オプションサービス名
		dataMap.put(FUW12402SFConst.OP_SVC_NM, channelBean.sendMessageString(FUW12401SFConst.OP_SVC_NM_01, X31CWebConst.DATABEAN_GET_VALUE));

		// デジタルティアグループコード
		dataMap.put(FUW12402SFConst.DGTIA_GRP_CD, channelBean.sendMessageString(FUW12401SFConst.DGTIA_GRP_CD_01, X31CWebConst.DATABEAN_GET_VALUE));

		// オプションチャンネル種別コード
		dataMap.put(FUW12402SFConst.OP_CHANNEL_SBT_CD, channelBean.sendMessageString(FUW12401SFConst.OP_CHANNEL_SBT_CD_01,
				X31CWebConst.DATABEAN_GET_VALUE));

		// 料金プラン固定金額
		// 料金プラン固定単位コード名称
		if (MSKM_DIV_IMASUGU.equals(mskmDiv))
		{
			// 今すぐ視聴の場合
			dataMap.put(FUW12402SFConst.PPLAN_KOTEI_AMNT, channelBean.sendMessageString(FUW12401SFConst.PPLAN_KOTEI_AMNT_01,
					X31CWebConst.DATABEAN_GET_VALUE));
			dataMap.put(FUW12402SFConst.PPLAN_KOTEI_TANI_CD_NM, channelBean.sendMessageString(FUW12401SFConst.PPLAN_KOTEI_TANI_CD_NM_01,
					X31CWebConst.DATABEAN_GET_VALUE));
		}
		else
		{
			// 来月から視聴の場合
			dataMap.put(FUW12402SFConst.PPLAN_KOTEI_AMNT, channelBean.sendMessageString(FUW12401SFConst.PPLAN_KOTEI_AMNT_NEXT_M_01,
					X31CWebConst.DATABEAN_GET_VALUE));
			dataMap.put(FUW12402SFConst.PPLAN_KOTEI_TANI_CD_NM, channelBean.sendMessageString(FUW12401SFConst.PPLAN_KOTEI_TANI_CD_NM_NEXT_M_01,
					X31CWebConst.DATABEAN_GET_VALUE));
		}

		// 月額料金
		String kindCd = channelBean.sendMessageString(FUW12401SFConst.PRC_KIND_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
		if (!MASTER_SET.equals(kindCd))
		{
			// プロパティの場合
			dataMap.put(FUW12402SFConst.PRC, channelBean.sendMessageString(FUW12401SFConst.PRC_01, X31CWebConst.DATABEAN_GET_VALUE));
		}
		else if (MSKM_DIV_IMASUGU.equals(mskmDiv))
		{
			// 今すぐ視聴の場合
			// 税込金額を設定
			String pplanKoteiAmntStr =
					channelBean.sendMessageString(FUW12401SFConst.PPLAN_KOTEI_AMNT_01,
							X31CWebConst.DATABEAN_GET_VALUE);
			dataMap.put(FUW12402SFConst.PRC, JPCUtilCommon.formatNumber(pplanKoteiAmntStr)
					+ channelBean.sendMessageString(FUW12401SFConst.PPLAN_KOTEI_TANI_CD_NM_01, X31CWebConst.DATABEAN_GET_VALUE) + INCLUDING_TAX);
		}
		else
		{
			// 来月から視聴の場合
			// 税込金額を設定
			String pplanKoteiAmntNextMStr =
					channelBean.sendMessageString(FUW12401SFConst.PPLAN_KOTEI_AMNT_NEXT_M_01,
							X31CWebConst.DATABEAN_GET_VALUE);
			dataMap.put(FUW12402SFConst.PRC, JPCUtilCommon.formatNumber(pplanKoteiAmntNextMStr)
					+ channelBean.sendMessageString(FUW12401SFConst.PPLAN_KOTEI_TANI_CD_NM_NEXT_M_01, X31CWebConst.DATABEAN_GET_VALUE) + INCLUDING_TAX);
		}

		// 料金コースコード
		dataMap.put(FUW12402SFConst.PCRS_CD, channelBean.sendMessageString(FUW12401SFConst.PCRS_CD_01, X31CWebConst.DATABEAN_GET_VALUE));

		// 料金プランコード
		dataMap.put(FUW12402SFConst.PPLAN_CD, channelBean.sendMessageString(FUW12401SFConst.PPLAN_CD_01, X31CWebConst.DATABEAN_GET_VALUE));

		// 備考
		//  備考設定時は全て次画面に引き継ぐ
		String biko = channelBean.sendMessageString(FUW12401SFConst.BIKO_01, X31CWebConst.DATABEAN_GET_VALUE);
		if (biko != null)
		{
			if (!JFUStrConst.EMPTY.equals(biko.trim()))
			{
				dataMap.put(FUW12402SFConst.BIKO, biko);
			}
		}

		DEBUG_LOG.info("----- FUW12401 End createDataMap -----");

		return dataMap;
	}

	/**
	 * C-CASカード番号のハイフン処理を行います。
	 * <br>
	 * @param arg0 	C-CASカード番号
	 * @return String 編集されたC-CASカード番号
	 */
	private static String editKikiSeizoNo(String arg0)
	{
		StringBuffer strBuf = new StringBuffer();

		// C-CASカード番号の文字数を取得
		int length = arg0.length();

		for (int i = 0; i < length; i++)
		{
			// C-CASカード番号の4桁目、8桁目、12桁目、16桁目にハイフンを設定
			if (4 == length - i || 8 == length - i || 12 == length - i || 16 == length - i)
			{
				strBuf.append(HYHUN);
			}

			strBuf.append(arg0.substring(i, i + 1));
		}

		return strBuf.toString();
	}

	/**
	 * 料金コースコードチェックを行います。
	 * <br>
	 * @param commonInfoBean	共有フォームBean
	 * @throws Exception		すべての例外
	 */
	private void checkPrcCd(X31SDataBeanAccess commonInfoBean) throws Exception
	{
		DEBUG_LOG.info("----- FUW12401 Start checkPrcCd -----");

		// サービス契約情報.料金コースコード
		String pcrsCd = JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO + JFUWebCommon.SEP_0 + CommonInfoCFConst.PCRS_CD_23);

		if (!JFUStrConst.CD00134_TV_CS_LIST.contains(pcrsCd))
		{
			// サービス契約の料金コースコードが、ＣＳコースでない場合

			// 業務共通例外クラス："0102"（契約状態エラー）
			DEBUG_LOG.info("■■■FUW12401 (6)サービス契約情報料金コースコードエラー(料金コースコード：" + pcrsCd + ")");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		DEBUG_LOG.info("----- FUW12401 End checkPrcCd -----");
	}

	/**
	 * 機器機種変更で予約中の場合のチェック
	 * <br>
	 * @param outputMap
	 */
	private void chkKikiMdlChgRsvcv(HashMap outputMap)
	{
		HashMap<String, ArrayList<HashMap>> rsvMap = (HashMap<String, ArrayList<HashMap>>)outputMap.get(CC_TITLE_FUSV038001CC);
		ArrayList<HashMap> rsvList = rsvMap.get(OUT_IDO_RSV_SVC_KEI_UCWK_LIST);
		//TODO: ＶＯＮＵの予約中を見るか？ 現状はＳＴＢの機器予約を判定
		for (HashMap rsvDtlMap : rsvList)
		{
			// 予約データが存在する場合は、 契約変更手続きエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
		}
	}
	
	/**
	 * 運用日付(OPEDATE)の設定です。
	 *
	 * 共通フォームBean.フロント共有情報.フロント運用日付に運用日付(OPEDATE)を設定。
	 *
	 * @param commonInfoBean 共通フォームBean
	 * @param opeDate 運用日付(OPEDATE)
	 */
	private void setFuOpedate(X31SDataBeanAccess commonInfoBean, String opeDate)
	{
		//=====================================================================
		// 運用日付の設定
		//=====================================================================
		// 共通フォームBean.フロント共有情報
		X31SDataBeanAccess frontInfo = commonInfoBean.getDataBeanArray(CommonInfoCFConst.FRONT_COMMON_INFO).getDataBean(0);
		// フロント共有情報.フロント運用日付を設定します。
		frontInfo.sendMessageString(CommonInfoCFConst.FU_OPEDATE_05, X31CWebConst.DATABEAN_SET_VALUE, opeDate);

	}

	/**
	 * 契約状態チェック
	 * @param commonInfoBean 共通フォームBean
	 * @param inCascdNo  CASカード番号
	 */
	private void checkKeistatus(X31SDataBeanAccess commonInfoBean, String inCascdNo)
	{
		if (!JFUWebCommon.isTvCsOpchSptvRnkStatOk(commonInfoBean, inCascdNo))
		{
			// 業務共通例外クラス："0102"（契約状態エラー）
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
	}
}
