/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：FUW06401SFLogic
*   ソースファイル名：FUW06401SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年10月17日
*＜機能概要＞
*   eo光テレビオプションチャンネル解約 ビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/10/17   FJ）南岡    新規作成
*	v4.00       2012/08/21   FJ) 美濃原 【ANK-0324-00-00】 オプションチャンネル申込の早期化について
*   v4.00       2012/09/12   FJ) 美濃原 【ANK-1163-00-00】 変更系申込が可能となるタイミングについて
*   v5.00       2013/05/23   FJ）文元   【ANK-1523-00-00】〔現行システム対応〕フロントＳテレビキャンペーン対応(TV共通チェック追加)
*   v11.00      2014/08/11   FJ) 谷本   【ANK-2141-00-00】STB交換方法の変更
*
**********************************************************************/
package eo.web.webview.FUW06401SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
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.X31CMessageResult.X31CMessageMoreInfo;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0049_FUSV0049OPDBMapper;
import eo.web.webview.mapping.FUSV0050_FUSV0050OPDBMapper;

/**
 * eo光テレビオプションチャンネル解約画面サービスフォームBeanビューロジックです。
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW06401SFLogic extends JCCWebBusinessLogic
{

	/** サービス:FUSV0049:eo光テレビオプションチャンネル解約(初期表示) */
	private static final String FUSV_ID_FUSV0049 = "FUSV0049";

	/** サービス:FUSV0050:eo光テレビオプションチャンネル解約(解約) */
	private static final String FUSV_ID_FUSV0050 = "FUSV0050";

	/** テンプレートID(オプションサービス契約解約) */
	private static final String TEMPLATE_ID_OP_SVC_KEI_DSL = "EKK0351C240";

	/** アイテムID(op_svc_kei_no) */
	private static final String ITEM_ID_OP_SVC_KEI_NO = "op_svc_kei_no";

	/** アイテムID(upd_dtm_bf) */
	private static final String ITEM_ID_UPD_DTM_DF = "upd_dtm_bf";

	/** アイテムID(ido_div) */
	private static final String ITEM_ID_IDO_DIV = "ido_div";

	/** ハイフン */
	private static final String HYHUN = "-";

	/** 機器提供サービス契約一覧照会（eo光テレビ情報取得）マップ ※STB*/
	private static final String FUSV004903_S_C = "FUSV004903SC";


	/** CCタイトル：異動予約取得コモンコンポーネント処理 */
	private static final String CC_TITLE_FUSV004901CC = "FUSV004901CC";
	/** 異動予約一覧 */
	private static final String OUT_IDO_RSV_SVC_KEI_UCWK_LIST = "ido_rsv_svc_kei_ucwk_list";
	/** 異動区分 */
	private static final String IDO_DIV = "ido_div";
	/** 異動予約状態区分 */
	private static final String IDO_RSV_STAT_CD = "ido_rsv_stat_cd";

	/**
	 * 初期処理を行います。
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		DEBUG_LOG.info("----- FUW06401 Start init -----");

		// 画面情報を取得し、サービスフォームBeanに設定
		JCCWebCommon.getScreenInfo(this);

		// 現顧客契約情報の最新化
		JFUWebCommon.refreshGenCustKei(this);

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// 料金コースコードチェック
		checkPrcCd(commonInfoBean);

		// 遷移元画面IDが"FUW09501"(メニューから遷移)の場合 ※直リンクは無い前提
		if (serviceFormBean.sendMessageString(FUW06401SFConst.MOTO_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE).equals(
				JFUScreenConst.SCREEN_ID_FUW09501))
		{
			// 共通関連チェック
			JFUWebCommon.checkCommonRelation(this, FUSV_ID_FUSV0050);
		}

		// 共有フォームBeanより値を取得
		getCommonFormBean(commonInfoBean, serviceFormBean);

		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, FUSV_ID_FUSV0049);


		// DataBean-BPマッピング
		FUSV0049_FUSV0049OPDBMapper mapper = new FUSV0049_FUSV0049OPDBMapper();

		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		HashMap outputMap = new HashMap();

		X31SDataBeanAccess[] paramBean = { serviceFormBean, commonInfoBean };
		mapper.setFUSV004901SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);	// 機器提供サービス契約一覧明細
		mapper.setFUSV004902SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);	// オプションチャンネル契約一覧のデータマッピング
		mapper.setFUSV004903SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV004901CC(paramBean, inputMap);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 業務共通例外クラス："0002"（システムエラー）
			DEBUG_LOG.info("■■■FUW06401 (1)サービスIF実行エラー ■■■");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		X31SDataBeanAccess[] paramBeanOut = { serviceFormBean };

		mapper.getFUSV004901SC(paramBeanOut, outputMap);	// 機器提供サービス契約一覧明細
		mapper.getFUSV004902SC(paramBeanOut, outputMap);	// オプションチャンネル契約一覧のデータマッピング


		// 機器機種変更中の予約中の場合は、エラーにする。
		chkKikiMdlChgRsvcv(outputMap);

		// STB機器の契約状態判定
		checkTvMskmAvailable(outputMap);
		
		// C-CASの機器製造番号を取得
		Map<String, String> dspData = getKikiSeizoNo(serviceFormBean);

		// 表示対象データの編集、C-CASカード番号ハイフン編集
		setKikiSeizoNoDisp(serviceFormBean, dspData, commonInfoBean);
		
		// オプションサービス契約チェック(存在チェック)
		chkOpSvcKei(serviceFormBean);

		// eo光テレビオプションチャンネル解約画面へ遷移
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW06401);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW06401);

		DEBUG_LOG.info("----- FUW06401 End init -----");

		return true;
	}

	/**
	 * 確認するボタン押下時処理を行います。
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean cfm() throws Exception
	{
		DEBUG_LOG.info("----- FUW06401 Start cfm -----");

		// 現顧客契約情報の最新化
		JFUWebCommon.refreshGenCustKei(this);

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// オプションチャンネル契約一覧（チェック用）のデータを削除
		X31SDataBeanAccessArray opChanelKeiListCheck = serviceFormBean.getDataBeanArray(FUW06401SFConst.OP_CHANNEL_KEI_LIST_CHECK);
		opChanelKeiListCheck.clearArray();

		// 機器提供サービス契約一覧のデータを削除
		X31SDataBeanAccessArray kikiSvcKeiList = serviceFormBean.getDataBeanArray(FUW06401SFConst.KIKI_SVC_KEI_LIST);
		kikiSvcKeiList.clearArray();

		// 解約対象オプションサービス契約情報取得
		setDslOpSvcKei(serviceFormBean, commonInfoBean);

		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, FUSV_ID_FUSV0050);

		// DataBean-BPマッピング
		FUSV0050_FUSV0050OPDBMapper mapper = new FUSV0050_FUSV0050OPDBMapper();

		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		HashMap<String, String> outputMap = new HashMap<String, String>();

		X31SDataBeanAccess[] paramBean = { serviceFormBean };
		mapper.setFUSV005001SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);	// 機器提供サービス契約一覧明細
		mapper.setFUSV005002SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);	// オプションチャンネル契約一覧（チェック用）
		mapper.setFUSV005003SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setdslOpSvcKeiMap(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);	// オプションチャンネル契約解約一覧

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 例外エラー処理
			setError(se);
		}

		X31SDataBeanAccess[] paramBeanOut = { serviceFormBean };

		mapper.getFUSV005001SC(paramBeanOut, outputMap);	// 機器提供サービス契約一覧明細
		mapper.getFUSV005002SC(paramBeanOut, outputMap);	// オプションチャンネル契約一覧（チェック用）

		// STB機器の契約状態判定
		checkTvMskmAvailable(outputMap);
		
		// C-CASの機器製造番号を取得
		Map<String, String> dspData = getKikiSeizoNo(serviceFormBean);

		// オプションサービス契約状態チェック
		chkOpSvcKeiState(serviceFormBean, dspData);

		// eo光テレビオプションチャンネル解約確認画面へ遷移
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW06402);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW06402);

		DEBUG_LOG.info("----- FUW06401 End cfm -----");

		return true;
	}

	/**
	 * 解約するボタン押下時処理を行います。
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean dsl() throws Exception
	{
		DEBUG_LOG.info("----- FUW06401 Start dsl -----");

		// 現顧客契約情報の最新化
		JFUWebCommon.refreshGenCustKei(this);

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// オプションチャンネル契約一覧（チェック用）のデータを削除
		X31SDataBeanAccessArray opChanelKeiListCheck = serviceFormBean.getDataBeanArray(FUW06401SFConst.OP_CHANNEL_KEI_LIST_CHECK);
		opChanelKeiListCheck.clearArray();

		// 機器提供サービス契約一覧のデータを削除
		X31SDataBeanAccessArray kikiSvcKeiList = serviceFormBean.getDataBeanArray(FUW06401SFConst.KIKI_SVC_KEI_LIST);
		kikiSvcKeiList.clearArray();

		// 共通関連チェック
		JFUWebCommon.checkCommonRelation(this, FUSV_ID_FUSV0050);

		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, FUSV_ID_FUSV0050);

		// DataBean-BPマッピング
		FUSV0050_FUSV0050OPDBMapper mapper = new FUSV0050_FUSV0050OPDBMapper();

		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		HashMap<String, String> outputMap = new HashMap<String, String>();

		X31SDataBeanAccess[] paramBean = { serviceFormBean };
		mapper.setFUSV005001SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);	// 機器提供サービス契約一覧明細
		mapper.setFUSV005002SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);	// オプションチャンネル契約一覧（チェック用）
		mapper.setFUSV005003SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setdslOpSvcKeiMap(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);	// オプションチャンネル契約解約一覧

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 例外エラー処理
			setError(se);
		}

		X31SDataBeanAccess[] paramBeanOut = { serviceFormBean };

		mapper.getFUSV005001SC(paramBeanOut, outputMap);	// 機器提供サービス契約一覧明細
		mapper.getFUSV005002SC(paramBeanOut, outputMap);	// オプションチャンネル契約一覧（チェック用）

		// STB機器の契約状態判定
		checkTvMskmAvailable(outputMap);
		
		// C-CASの機器製造番号を取得
		Map<String, String> dspData = getKikiSeizoNo(serviceFormBean);

		// オプションサービス契約状態チェック
		chkOpSvcKeiState(serviceFormBean, dspData);

		// eo光テレビオプションチャンネル解約結果画面へ遷移
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW06403);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW06403);

		DEBUG_LOG.info("----- FUW06401 End dsl -----");

		return true;
	}

	/**
	 * 戻るボタン押下時処理を行います。
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean back() throws Exception
	{
		DEBUG_LOG.info("----- FUW06401 Start back -----");

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// eo光テレビオプションチャンネル解約画面へ遷移
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW06401);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW06401);

		DEBUG_LOG.info("----- FUW06401 End back -----");

		return true;
	}

	/**
	 * 共有フォームBean設定値取得処理を行います。
	 * 
	 * @param commonInfoBean			共有フォームBean
	 * @param serviceFormBean			サービスフォームBean
	 * @throws JCCBusinessException	例外
	 */
	private void getCommonFormBean(X31SDataBeanAccess commonInfoBean, X31SDataBeanAccess serviceFormBean) throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW06401 Start getCommonFormBean -----");

		// 共有フォームBeanより値を取得しサービスフォームBeanに設定

		//**********************************//
		// ＳＳＯ情報
		//**********************************//

		// ＳＳＯ情報を取得
		X31SDataBeanAccess ssoInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);

		// ＳＳＯ情報.SYSIDを取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06401SFConst.SYSID, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(ssoInfo,
				CommonInfoCFConst.SYSID_21));

		// ＳＳＯ情報.サービス契約番号を取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06401SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(ssoInfo,
				CommonInfoCFConst.SVC_KEI_NO_21));

		//**********************************//
		// 請求契約情報
		//**********************************//

		// 請求契約情報の取得
		X31SDataBeanAccess seikyKeiInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SEIKY_KEI_INFO);

		// 請求契約情報.請求契約番号を取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06401SFConst.SEIKY_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				seikyKeiInfo, CommonInfoCFConst.SEIKY_KEI_NO_32));

		DEBUG_LOG.info("----- FUW06401 End getCommonFormBean -----");
	}

	/**
	 * 機器提供サービス契約状態チェック処理を行います。
	 * 
	 * @param commonInfoBean			共有フォームBean
	 * @param serviceFormBean			サービスフォームBean
	 * @return 表示対象のCCAS-No
	 * @throws JCCBusinessException	例外
	 */
	private Map<String, String> getKikiSeizoNo(X31SDataBeanAccess serviceFormBean)
			throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW06401 Start getKikiSeizoNo -----");

		Map<String, String> dspData = new HashMap<String, String>();

		// 機器提供サービス契約情報一覧を取得
		X31SDataBeanAccessArray kikiSvcKeiList = serviceFormBean.getDataBeanArray(FUW06401SFConst.KIKI_SVC_KEI_LIST);

		for (int i = 0; i < kikiSvcKeiList.getCount(); ++i)
		{
			// 機器提供サービス契約情報を取得
			X31SDataBeanAccess kikiSvcKeiBean = kikiSvcKeiList.getDataBean(i);

			if (JFUStrConst.KK0771_KKTK_SVC_CD_C011.equals(kikiSvcKeiBean.sendMessageString(FUW06401SFConst.KKTK_SVC_CD_02,
					X31CWebConst.DATABEAN_GET_VALUE)))
			{
				// C-CASの製造番号取得
				String ccasNo = kikiSvcKeiBean.sendMessageString(FUW06401SFConst.KIKI_SEIZO_NO_02, X31CWebConst.DATABEAN_GET_VALUE);
				dspData.put(ccasNo, ccasNo);
			}
		}

		if (dspData.size() == 0)
		{
			// 業務共通例外クラス："0102"（契約状態エラー）
			DEBUG_LOG.info("■■■FUW06401 (2)STB契約状態チェックエラー(契約状態エラー)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		DEBUG_LOG.info("----- FUW06401 End getKikiSeizoNo -----");

		return dspData;

	}

	/**
	 * オプションサービス契約存在チェック処理を行います。
	 * 
	 * @param serviceFormBean			サービスフォームBean
	 * @throws JCCBusinessException	例外
	 * 	 */
	private void chkOpSvcKei(X31SDataBeanAccess serviceFormBean) throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW06401 Start chkOpSvcKei -----");

		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelKeiList = serviceFormBean.getDataBeanArray(FUW06401SFConst.OP_CHANNEL_KEI_LIST);

		// オプションサービス契約情報をO件の場合
		if (opChannelKeiList.getCount() == 0)
		{
			// 業務共通例外クラス："0102"（契約状態エラー）
			DEBUG_LOG.info("■■■FUW06401 (3)オプションサービス契約存在チェックエラー(契約状態エラー)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		DEBUG_LOG.info("----- FUW06401 End chkOpSvcKei -----");
	}

	/**
	 * オプションサービス契約状態チェック処理を行います。
	 * 
	 * @param serviceFormBean			サービスフォームBean
	 * @param dspData	表示対象のCCAS情報
	 * @throws JCCBusinessException	例外
	 * 	 */
	private void chkOpSvcKeiState(X31SDataBeanAccess serviceFormBean, Map<String, String> dspData) throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW06401 Start chkOpSvcKeiState -----");

		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelKeiDslList = serviceFormBean.getDataBeanArray(FUW06401SFConst.OP_CHANNEL_KEI_DSL_LIST);

		// 解約対象オプションサービス契約情報一覧の件数分処理
		for (int i = 0; i < opChannelKeiDslList.getCount(); ++i)
		{
			// 解約対処オプションチャンネル契約情報を取得
			X31SDataBeanAccess channelKeiDslBean = opChannelKeiDslList.getDataBean(i);

			String kikiSeizoNo = channelKeiDslBean.sendMessageString(FUW06401SFConst.KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_GET_VALUE);
			//String opSvcCdNm = channelKeiBean.sendMessageString(FUW06401SFConst.OP_SVC_CD_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

			if (!dspData.containsKey(kikiSeizoNo))
			{
				// 機器提供サービス契約の状態エラー
				// 業務共通例外クラス："0102"（契約状態エラー）
				DEBUG_LOG.info("■■■FUW06401 (4)STB契約状態チェックエラー(契約状態エラー)");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
			
			// 検索条件設定
			Map<String, String> condition = new HashMap<String, String>();
			// オプションサービス契約番号
			condition.put(FUW06401SFConst.OP_SVC_KEI_NO_01, channelKeiDslBean.sendMessageString(FUW06401SFConst.OP_SVC_KEI_NO_01,
					X31CWebConst.DATABEAN_GET_VALUE));

			// サービスフォームBeanのサービス契約情報から製造機器番号のデータを取得
			X31SDataBeanAccess opChannelKeiBean =
					JFUWebCommon.getDataBeanTypeByPathWithKey(serviceFormBean, FUW06401SFConst.OP_CHANNEL_KEI_LIST_CHECK, condition);

			// 解約対象オプションサービス契約情報がオプションサービス契約状態一覧(チェック用)に存在しない場合
			if (opChannelKeiBean == null)
			{
				// 業務共通例外クラス："0102"（契約状態エラー）
				DEBUG_LOG.info("■■■FUW06401 (5)オプションサービス契約状態チェックエラー(契約状態エラー)");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
		}

		DEBUG_LOG.info("----- FUW06401 End chkOpSvcKeiState -----");
	}

	/**
	 * 解約対象オプションサービス契約設定処理を行います。
	 * 
	 * @param serviceFormBean			サービスフォームBean
	 * @param commonInfoBean			共有フォームBean
	 * @throws JCCBusinessException	例外
	 * 	 */
	private void setDslOpSvcKei(X31SDataBeanAccess serviceFormBean, X31SDataBeanAccess commonInfoBean) throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW06401 Start setDslOpSvcKei -----");

		// 最終更新年月日取得
		String lastUpdDtm = getLastUpdDtm(commonInfoBean);

		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelKeiList = serviceFormBean.getDataBeanArray(FUW06401SFConst.OP_CHANNEL_KEI_LIST);

		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelKeiDelList = serviceFormBean.getDataBeanArray(FUW06401SFConst.OP_CHANNEL_KEI_DSL_LIST);
		opChannelKeiDelList.clearArray();

		int cnt = 0;
		// オプションチャンネル契約一覧の件数分処理
		for (int i = 0; i < opChannelKeiList.getCount(); ++i)
		{
			// オプションチャンネル契約情報を取得
			X31SDataBeanAccess channelKeiBean = opChannelKeiList.getDataBean(i);

			// 解約するチェックボックスがONの場合
			if (channelKeiBean.sendMessageBoolean(FUW06401SFConst.DSL_01, X31CWebConst.DATABEAN_GET_VALUE))
			{
				// オプションサービス契約解約一覧情報を取得
				X31SDataBeanAccess opChannelKeiDslInfo =
						JFUWebCommon.createAndGetDataBeanTypeByPath(serviceFormBean, FUW06401SFConst.OP_CHANNEL_KEI_DSL_LIST
								+ JFUWebCommon.SEP_N_LAST, cnt);

				// オプションサービス契約解約一覧情報の「オプションサービス契約番号」の項目に値を設定
				JFUWebCommon.setDataBeanItemByPath(opChannelKeiDslInfo, FUW06401SFConst.OP_SVC_KEI_NO_01, channelKeiBean.sendMessageString(
						FUW06401SFConst.OP_SVC_KEI_NO_01, X31CWebConst.DATABEAN_GET_VALUE));

				// オプションサービス契約解約一覧情報の「更新年月日時分秒」の項目に値を設定
				JFUWebCommon.setDataBeanItemByPath(opChannelKeiDslInfo, FUW06401SFConst.UPD_DTM_01, lastUpdDtm);

				// オプションサービス契約解約一覧情報の「オプションサービスコード」の項目に値を設定
				JFUWebCommon.setDataBeanItemByPath(opChannelKeiDslInfo, FUW06401SFConst.OP_SVC_CD_01, channelKeiBean.sendMessageString(
						FUW06401SFConst.OP_SVC_CD_01, X31CWebConst.DATABEAN_GET_VALUE));

				// オプションサービス契約解約一覧情報の「サービス契約内訳番号」の項目に値を設定
				JFUWebCommon.setDataBeanItemByPath(opChannelKeiDslInfo, FUW06401SFConst.SVC_KEI_UCWK_NO_01, channelKeiBean.sendMessageString(
						FUW06401SFConst.SVC_KEI_UCWK_NO_01, X31CWebConst.DATABEAN_GET_VALUE));

				// オプションサービス契約解約一覧情報の「オプションサービス契約ステータス」の項目に値を設定
				JFUWebCommon.setDataBeanItemByPath(opChannelKeiDslInfo, FUW06401SFConst.OP_SVC_KEI_STAT_01, channelKeiBean.sendMessageString(
						FUW06401SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE));

				// オプションサービス契約解約一覧情報の「オプションサービス名称」の項目に値を設定
				JFUWebCommon.setDataBeanItemByPath(opChannelKeiDslInfo, FUW06401SFConst.OP_SVC_CD_NM_01, channelKeiBean.sendMessageString(
						FUW06401SFConst.OP_SVC_CD_NM_01, X31CWebConst.DATABEAN_GET_VALUE));

				// オプションサービス契約解約一覧情報の「C-CASカード番号」の項目に値を設定
				JFUWebCommon.setDataBeanItemByPath(opChannelKeiDslInfo, FUW06401SFConst.KIKI_SEIZO_NO_01, channelKeiBean.sendMessageString(
						FUW06401SFConst.KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_GET_VALUE));

				// オプションサービス契約解約一覧情報の「C-CASカード番号(表示用)」の項目に値を設定
				JFUWebCommon.setDataBeanItemByPath(opChannelKeiDslInfo, FUW06401SFConst.KIKI_SEIZO_NO_DISP_01, channelKeiBean.sendMessageString(
						FUW06401SFConst.KIKI_SEIZO_NO_DISP_01, X31CWebConst.DATABEAN_GET_VALUE));

				++cnt;
			}
		}

		DEBUG_LOG.info("----- FUW06401 End setDslOpSvcKei -----");
	}

	/**
	 * 最終更新年月日取得処理を行います。
	 * 
	 * @param commonInfoBean			共有フォームBean
	 * @return 最終更新年月日
	 */
	private static String getLastUpdDtm(X31SDataBeanAccess commonInfoBean)
	{
		DEBUG_LOG.info("----- FUW06401 Start getLastUpdDtm -----");

		// 最終更新年月日
		String lastUpdDtm = null;

		//**********************************//
		// サービス契約情報
		//**********************************//

		// サービス契約情報を取得
		X31SDataBeanAccess svcKeiInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);

		// サービス契約情報.最終更新年月日時分秒を取得しサービスフォームBeanに設定
		lastUpdDtm = JFUWebCommon.getDataBeanItemByPath(svcKeiInfo, CommonInfoCFConst.LAST_UPD_DTM_23);

		DEBUG_LOG.info("----- FUW06401 End getLastUpdDtm -----");

		return lastUpdDtm;
	}

	/**
	 * 例外情報処理を行います。
	 * 
	 * @param se	JCCWebServiceException
	 */
	private void setError(JCCWebServiceException se)
	{
		DEBUG_LOG.info("----- FUW06401 Start setError -----");

		// 例外情報を取得
		X31CMessageResult msgResult = se.getMessageList();
		X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
		X31CMessageMoreInfo info = moreInfo[0];// 関連チェック系は必ずエラーが1つのため0番目から取得する。
		String templateid = info.getTemplateId();
		String itemid = info.getItemId();
		String status = info.getStatus();
		String errFlg = info.getItemCheckErr();

		// ステータスが"1100"（内部スキーマ関連チェックエラー）または"1150"（内部スキーマの状態遷移チェックエラー)の場合
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status) || String.valueOf(JPCModelConstant.STATUSTRANS_ERR).equals(status))
		{
			// テンプレートIDが"EKK0351C240"(オプションサービス契約解約)の場合
			// かつ、エラーフラグが"EA"の場合
			if (TEMPLATE_ID_OP_SVC_KEI_DSL.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg))
			{
				// アイテムIDが"op_svc_kei_no"(オプションサービス契約番号)の場合
				if (ITEM_ID_OP_SVC_KEI_NO.equals(itemid))
				{
					// 業務共通例外クラス："0102"（契約状態エラー）
					DEBUG_LOG.info("■■■FUW06401 (6)サービスIF実行エラー(EKK0381D010)");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}
			}

			// アイテムIDが"upd_dtm_df"(更新年月日時分秒(更新前))の場合
			// かつ、エラーフラグが"EA"の場合
			if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && ITEM_ID_UPD_DTM_DF.equals(itemid))
			{
				// 業務共通例外クラス："0201"（お客様情報変更エラー）
				DEBUG_LOG.info("■■■FUW06401 (7)サービスIF実行エラー(排他チェックエラー)");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0201);
			}
		}

		// ステータスが"1300"(外部スキーマの相関チェックエラー)の場合
		if (String.valueOf(JPCModelConstant.TEMPLATE_CORRELATION_ERR).equals(status))
		{
			// アイテムIDが"ido_div"(異動区分)の場合
			if (ITEM_ID_IDO_DIV.equals(itemid))
			{

				// 業務共通例外クラス："0102"（契約状態エラー）
				DEBUG_LOG.info("■■■FUW06401 (8)サービスIF実行エラー(異動予約エラー)");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
		}

		// 業務共通例外クラス："0002"（システムエラー）
		DEBUG_LOG.info("■■■FUW06401 (9)サービスIF実行エラー(システムエラー)");
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
	}

	/**
	 * C-CASカード番号(表示用)設定処理を行います。
	 * <br>
	 * @param serviceFormBean	サービスフォームBean
	 * @param dspData	表示対象のCCAS情報
	 * @param commonInfoBean	共有フォームBean
	 */
	private static void setKikiSeizoNoDisp(X31SDataBeanAccess serviceFormBean, Map<String, String> dspData, X31SDataBeanAccess commonInfoBean)
	{
		DEBUG_LOG.info("----- FUW06401 Start setKikiSeizoNoDisp -----");

		// ＳＳＯ情報の取得
		X31SDataBeanAccess ssoInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);
		// 共有フォームBeanのＳＳＯ情報.C-CASカード番号を取得しサービスフォームBeanに設定
		String ssokikiSeizoNo = JFUWebCommon.getDataBeanItemByPath(ssoInfo, CommonInfoCFConst.KIKI_SEIZO_NO_21);
		
		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelKeiList = serviceFormBean.getDataBeanArray(FUW06401SFConst.OP_CHANNEL_KEI_LIST);

		// 表示用データワーク
		ArrayList<HashMap<String, String>> dspData_array = new ArrayList<HashMap<String, String>>();

		// オプションチャンネル契約一覧の件数分処理
		String[] itemName = null; // 項目名リスト

		for (int i = 0; i < opChannelKeiList.getCount(); ++i)
		{
			// オプションチャンネル契約情報を取得
			X31SDataBeanAccess channelKeiBean = opChannelKeiList.getDataBean(i);

			String kikiSeizoNo = channelKeiBean.sendMessageString(FUW06401SFConst.KIKI_SEIZO_NO_01, X31CWebConst.DATABEAN_GET_VALUE);

			// ログイン時のCCASと異なる場合はスキップ
			if (!ssokikiSeizoNo.equals(kikiSeizoNo))
			{
				continue;
			}

			if (dspData.containsKey(kikiSeizoNo))
			{
				// C-CASカード番号をハイフン編集
				String kikiSeizoNoDisp = editKikiSeizoNo(kikiSeizoNo);
				channelKeiBean.sendMessageString(FUW06401SFConst.KIKI_SEIZO_NO_DISP_01, X31CWebConst.DATABEAN_SET_VALUE, kikiSeizoNoDisp);

				HashMap<String, String> dataMap = new HashMap<String, String>();
				// 表示用ワークにコピー
				if (itemName == null)
				{
					itemName = channelKeiBean.getItemNameList();
				}
				// 全項目をコピー
				for (int idx = 0; idx < itemName.length; ++idx)
				{
					dataMap.put(itemName[idx], channelKeiBean.sendMessageString(itemName[idx], X31CWebConst.DATABEAN_GET_VALUE));
				}
				dspData_array.add(dataMap);
			}
		}

		// 表示用Beanの初期化
		opChannelKeiList.clearArray();

		// 表示用ワークから表示用Beanへ編集
		for (int i = 0; i < dspData_array.size(); ++i)
		{
			HashMap<String, String> dataMap = dspData_array.get(i);
			X31SDataBeanAccess subbean = opChannelKeiList.addDataBean();

			// 全項目をコピー
			for (int idx = 0; idx < itemName.length; ++idx)
			{
				String strData = dataMap.get(itemName[idx]);
				subbean.sendMessageString(itemName[idx], X31CWebConst.DATABEAN_SET_VALUE, strData);
			}
		}

		DEBUG_LOG.info("----- FUW06401 End setKikiSeizoNoDisp -----");
	}

	/**
	 * 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
	{
		// サービス契約情報.料金コースコード
		String pcrsCd = JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO + JFUWebCommon.SEP_0 + CommonInfoCFConst.PCRS_CD_23);

		if (JFUStrConst.CD00134_A37.equals(pcrsCd) || JFUStrConst.CD00134_A23.equals(pcrsCd) || JFUStrConst.CD00134_A75.equals(pcrsCd))
		{
			// サービス契約の料金コースコードが、地デジ・ＢＳコース、eo光テレビ再送信、eo光テレビ再送信（地デジ・ＢＳコース）の場合

			// 業務共通例外クラス："0102"（契約状態エラー）
			DEBUG_LOG.info("■■■FUW06401 (10)サービス契約情報料金コースコードエラー(料金コースコード：" + pcrsCd + ")");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
	}
	
	/**
	 * テレビ関連の申し込み可否チェック処理を行います。
	 * <br>
	 * @param outputMap	 検索結果格納用マップ
	 * @return 処理結果
	 * @throws Exception 
	 * */
	@SuppressWarnings("unchecked")
	private Map<String, String> checkTvMskmAvailable(HashMap outputMap) throws Exception
	{
		DEBUG_LOG.info("----- FUW06401 Start checkTvMskmAvailable -----");

		// テレビ関連の申し込み可否チェック処理(申し込めない状態の場合、部品内でthrows)
		Map<String, String> resultMap =
				JFUWebCommon.checkTvMskmAvailable(this, JFUScreenConst.SCREEN_ID_FUW06401, 
						(HashMap)outputMap.get(FUSV004903_S_C), JCCWebCommon.getOpeDate(this, null));

		DEBUG_LOG.info("----- FUW06401 End checkTvMskmAvailable -----");

		return resultMap;
	}

	/**
	 * 機器機種変更で予約中の場合のチェック(サービス契約内訳単位)
	 * <br>
	 * @param outputMap	
	 */
	private void chkKikiMdlChgRsvcv(HashMap outputMap)
	{
		HashMap<String, ArrayList<HashMap>> rsvMap = (HashMap<String, ArrayList<HashMap>>)outputMap.get(CC_TITLE_FUSV004901CC);
		ArrayList<HashMap> rsvList = rsvMap.get(OUT_IDO_RSV_SVC_KEI_UCWK_LIST);
		for (HashMap rsvDtlMap : rsvList)
		{
			// 予約データが存在する場合は、 契約変更手続きエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
		}
	}

}
