/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：FUW06302SFLogic
*   ソースファイル名：FUW06302SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年09月28日
*＜機能概要＞
*   eo光テレビオプションチャンネル追加確認 ビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/09/28   FJ）南岡    新規作成
*   v3.00       2012/04/27   FJ）南岡   【ANK-0281-00-00】 基本コース・オプションCH組合せチェック
*	v4.00       2012/08/21   FJ) 美濃原 【ANK-0324-00-00】 オプションチャンネル申込の早期化について
*   v4.00       2012/09/12   FJ) 美濃原 【ANK-1163-00-00】 変更系申込が可能となるタイミングについて
*   v5.01       2013/09/03   FJ）文元   【OM-2013-0001581】C-CAS製造番号に紐づく機器提供サービス契約が複数件存在する場合エラーとなる不具合対応
*	v14.00		2015/03/17   FJ) 谷本   【ANK-2394-00-00】進捗タブ処理内容改善
**********************************************************************/
package eo.web.webview.FUW06302SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

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.FUW06301SF.FUW06301SFConst;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0083_FUSV0083OPDBMapper;

/**
 * eo光テレビオプションチャンネル追加画面サービスフォームBeanビューロジッククラスです。
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW06302SFLogic extends JCCWebBusinessLogic
{

	/** サービス:FUSV0083:eo光テレビオプションチャンネル追加(申込) */
	private static final String FUSV_ID = "FUSV0083";

	/** スター・チャンネルフラグ:0:スター・チャンネル以外 */
	private static final String STAR_CHANNEL_FLG_OFF = "0";

	/** スター・チャンネルフラグ:1:スター・チャンネル */
	private static final String STAR_CHANNEL_FLG_ON = "1";

	/** 申込区分("2"：来月から視聴) */
	private static final String MSKM_DIV_RAIGETSU = "2";

	/** 実行フラグ("0"：実行しない) */
	private static final String RUN_FLG_OFF = "0";

	/** 実行フラグ("1"：実行する) */
	private static final String RUN_FLG_ON = "1";

	/** ハイフン */
	private static final String HYHUN = "-";

	/** テンプレートID(オプションサービス契約登録) */
	private static final String TEMPLATE_ID_OP_SVC_KEI_ADD = "EKK0381D010";

	/** テンプレートID(料金コース_オプションサービス一意照会) */
	private static final String TEMPLATE_ID_PRCS_OP_SVC = "EKK0811A010";

	/** アイテムID(svc_kei_no) */
	private static final String ITEM_ID_SVC_KEI_NO = "svc_kei_no";

	/** アイテムID(op_svc_kei_ucwk_no) */
	private static final String ITEM_ID_SVC_KEI_UCWK_NO = "svc_kei_ucwk_no";

	/** アイテムID(op_svc_cd) */
	private static final String ITEM_ID_OP_SVC_CD = "op_svc_cd";

	/** アイテムID(upd_dtm_bf) */
	private static final String ITEM_ID_UPD_DTM_BF = "upd_dtm_bf";

	/** アイテムID(upd_dtm_bf) */
	private static final String ITEM_ID_IDO_DIV = "ido_div";

	/** 即日／翌月("01":即日) */
	private static final String SKJ_YKGT_SKJ = "01";

	/** 即日／翌月("02":翌月) */
	private static final String SKJ_YKGT_YKGT = "02";

	/** 画面定義ノード取得部品設定値(クエリ:スターチャンネル) */
	private static final String STAR_CHANNEL_QUERY_CTL = "DISPSETTING/SETTING[@screenId='FUW06302']/DISPCTL[@id='star_channel']/text()";

	/** 画面定義ノード取得部品設定値(クエリ:スターチャンネル月額料金) */
	private static final String STAR_CHANNEL_TEXT = "DISPSETTING/SETTING[@screenId='FUW06302']/DISPTEXT[@id='star_channel_text']/text()";

	/** カンマ */
	private static final String COMMA = ",";

	/** 置き換え文字列1*/
	private static final String REPLACE_1 = "%1%";

	// JFUCheckKikiTeikyoStatus
	/** 処理結果 */
	private static final String RTN_RESULT = "RTN_RESULT";
	/** 処理結果 NG */
	private static final String RTN_RESULT_NG = "NG";

	/**
	 * 初期処理を行います。
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		DEBUG_LOG.info("----- FUW06302 Start init -----");

		// 画面情報を取得し、サービスフォームBeanに設定
		JFUWebCommon.getScreenInfo(this);

		// 現顧客契約リフレッシュ判定処理
		JFUWebCommon.refreshGenCustKei(this);

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// STB機器の契約状態判定
		chkKikiSvcKey(serviceFormBean);

		// 共有フォームBeanより値を取得
		getCommonFormBean(commonInfoBean, serviceFormBean);

		//***********************************//
		// サービスフォームBeanへ値を設定
		//***********************************//

		// サービスフォームBeanのC-CASカード番号をハイフン編集
		String kikiSeizoNoDisp = editKikiSeizoNo(serviceFormBean.sendMessageString(FUW06301SFConst.KIKI_SEIZO_NO, X31CWebConst.DATABEAN_GET_VALUE));

		// ハイフン編集したC-CASカード番号をサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06302SFConst.KIKI_SEIZO_NO_DISP, X31CWebConst.DATABEAN_SET_VALUE, kikiSeizoNoDisp);

		// スター・チャンネルフラグ
		// オプションサービスコードがスターチャンネルの場合
		if (chkStarChannel(serviceFormBean))
		{
			// スター・チャンネルフラグに1(スターチャンネル)を設定
			serviceFormBean.sendMessageString(FUW06302SFConst.STAR_CHANNEL_FLG, X31CWebConst.DATABEAN_SET_VALUE, STAR_CHANNEL_FLG_ON);
			// 視聴料に月額料金を設定
			serviceFormBean.sendMessageString(FUW06302SFConst.WATCH_PRC, X31CWebConst.DATABEAN_SET_VALUE, setStarChannel(serviceFormBean));
			
		}
		else
		{
			// スター・チャンネルフラグに0(スターチャンネル以外)を設定
			serviceFormBean.sendMessageString(FUW06302SFConst.STAR_CHANNEL_FLG, X31CWebConst.DATABEAN_SET_VALUE, STAR_CHANNEL_FLG_OFF);
		}

		// 視聴制御依頼処理コード
		serviceFormBean.sendMessageString(FUW06302SFConst.WCTRL_REQ_TRN_CD, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.CD00365_30);

		// 申込登録明細情報作成
		// サービスフォームBeanの申込登録明細取得
		X31SDataBeanAccess mskmAddList = JFUWebCommon.createAndGetDataBeanTypeByPath(serviceFormBean, FUW06302SFConst.MSKM_ADD_LIST);

		// 申込登録明細.申込形態コードに"01"(WEBを)設定
		JFUWebCommon.setDataBeanItemByPath(mskmAddList, FUW06302SFConst.MSKM_FORM_CD_02, JFUStrConst.CD00591_01);

		// 異同理由明細情報作成
		// サービスフォームBeanの異同理由明細取得
		X31SDataBeanAccess idoRiyuList = JFUWebCommon.createAndGetDataBeanTypeByPath(serviceFormBean, FUW06302SFConst.IDO_RIYU_LIST);

		// 異同理由明細.異同理由コードに値"56"(その他)を設定
		JFUWebCommon.setDataBeanItemByPath(idoRiyuList, FUW06302SFConst.IDO_RSN_CD_03, JFUStrConst.CD00846_56);

		// サービス利用開始年月日を設定
		// オンライン運用日付を取得
		String svcUseStaYmd = JFUWebCommon.getOpeDate(this, null);

		// 即日／翌月に"01"(即日)を設定
		serviceFormBean.sendMessageString(FUW06302SFConst.SKJ_YKGT, X31CWebConst.DATABEAN_SET_VALUE, SKJ_YKGT_SKJ);

		// 申込区分が2(来月から視聴)の場合
		if (MSKM_DIV_RAIGETSU.equals(serviceFormBean.sendMessageString(FUW06302SFConst.MSKM_DIV, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// 翌月の1日を取得
			svcUseStaYmd = JFUWebCommon.getBeginOfNextMonthDate(svcUseStaYmd);

			// 即日／翌月に"02"(翌月)を設定
			serviceFormBean.sendMessageString(FUW06302SFConst.SKJ_YKGT, X31CWebConst.DATABEAN_SET_VALUE, SKJ_YKGT_YKGT);
		}

		serviceFormBean.sendMessageString(FUW06302SFConst.SVC_USE_STA_YMD, X31CWebConst.DATABEAN_SET_VALUE, svcUseStaYmd);

		// 実行フラグに"1"(実行)を設定(デジタルグループティアコード一覧照会実行判定に使用)
		serviceFormBean.sendMessageString(FUW06302SFConst.RUN_FLG, X31CWebConst.DATABEAN_SET_VALUE, RUN_FLG_ON);

		// 機器提供サービス契約情報を取得
		X31SDataBeanAccessArray comkktkSvcKeiInfo = commonInfoBean.getDataBeanArray(JFUWebCommon.KKTK_SVC_KEI_INFO);
		
		// C-CASカード番号(C-CASの機器製造番号)に紐づく機器提供サービス契約のサービス契約内訳番号取得
		String svcKeiUcwkNo =
				JFUWebCommon.getKktkSvcCdSvcUcwkNo(comkktkSvcKeiInfo, JFUStrConst.KK0771_KKTK_SVC_CD_C011, serviceFormBean.sendMessageString(
						FUW06301SFConst.KIKI_SEIZO_NO, X31CWebConst.DATABEAN_GET_VALUE));
		
		//**********************************//
		// サービス処理
		//**********************************//

		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, FUSV_ID);

		// DataBean-BPマッピング
		FUSV0083_FUSV0083OPDBMapper mapper = new FUSV0083_FUSV0083OPDBMapper();

		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		HashMap<String, String> outputMap = new HashMap<String, String>();

		X31SDataBeanAccess[] paramBean = { serviceFormBean };
		mapper.setFUSV008301SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1, svcKeiUcwkNo);
		mapper.setFUSV008302SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV008303SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV008304SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV008305SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV008306SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV008309SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setWctrlOrderSendMap(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV008307SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV008308SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		/* ++++++++++ v3.00 開始終了 ++++++++++ */
		mapper.setFUSV008311SC(paramBean, inputMap);
		/* ++++++++++ v3.00 修正終了 ++++++++++ */
		mapper.setFUSV008310SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
			mapper.getFUSV008301SC(paramBean, outputMap);
			mapper.getFUSV008309SC(paramBean, outputMap);
			mapper.getFUSV008310SC(paramBean, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 例外判定
			setError(se);
		}

		//**********************************//
		// サービス処理結果判定
		//**********************************//

		// STB機器の契約状態判定
		chkOpSvcKeiListCount(serviceFormBean);

		// オプションチャンネルの契約状態判定
		chkOpSvcKeiStats(serviceFormBean);

		//**********************************//
		// 画面遷移
		//**********************************//

		// eo光テレビオプションチャンネル追加画面へ遷移
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW06302);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW06302);

		DEBUG_LOG.info("----- FUW06302 End init -----");

		return true;
	}

	/**
	 * 申し込むボタン押下処理を行います。
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean mskm() throws Exception
	{
		DEBUG_LOG.info("----- FUW06302 Start mskm -----");

		// 現顧客契約リフレッシュ判定処理
		JFUWebCommon.refreshGenCustKei(this);

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// 共通関連チェック
		JFUWebCommon.checkCommonRelation(this, FUSV_ID);

		// STB機器の契約状態判定
		chkKikiSvcKey(serviceFormBean);

		// オプションサービス契約状態一覧のデータを削除
		X31SDataBeanAccessArray opChanelKeiStatList = serviceFormBean.getDataBeanArray(FUW06302SFConst.OP_CHANELL_KEI_STAT_LIST);
		opChanelKeiStatList.clearArray();

		//***********************************//
		// サービスフォームBeanへ値を設定
		//***********************************//

		// サービス利用開始年月日を設定
		// オンライン運用日付を取得
		String svcUseStaYmd = JFUWebCommon.getOpeDate(this, null);

		// 申込区分が2(来月から視聴)の場合
		if (MSKM_DIV_RAIGETSU.equals(serviceFormBean.sendMessageString(FUW06302SFConst.MSKM_DIV, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// 翌月の1日を取得
			svcUseStaYmd = JFUWebCommon.getBeginOfNextMonthDate(svcUseStaYmd);
		}
		serviceFormBean.sendMessageString(FUW06302SFConst.SVC_USE_STA_YMD, X31CWebConst.DATABEAN_SET_VALUE, svcUseStaYmd);

		// 実行フラグに"0"(実行)を設定(デジタルグループティアコード一覧照会実行判定に使用)
		serviceFormBean.sendMessageString(FUW06302SFConst.RUN_FLG, X31CWebConst.DATABEAN_SET_VALUE, RUN_FLG_OFF);

		// デジタルティアグループコード一覧に申込対象のデジタルグループティアコードを追加設定
		// デジタルティアグループコード一覧取得
		X31SDataBeanAccessArray dgtiaGrpCdList = serviceFormBean.getDataBeanArray(FUW06302SFConst.DGTIA_GRP_CD_LIST);

		X31SDataBeanAccess dgtiaGrpCdListn =
				JFUWebCommon.createAndGetDataBeanTypeByPath(serviceFormBean, FUW06302SFConst.DGTIA_GRP_CD_LIST + JFUWebCommon.SEP_N_LAST,
						dgtiaGrpCdList.getCount());

		// n番目のデジタルティアグループコード一覧のデジタルティアグループコードに値を設定
		JFUWebCommon.setDataBeanItemByPath(dgtiaGrpCdListn, FUW06302SFConst.DGTIA_GRP_CD_04, serviceFormBean.sendMessageString(
				FUW06302SFConst.DGTIA_GRP_CD, X31CWebConst.DATABEAN_GET_VALUE));

		// 機器製造番号
		String kikiSeizoNoDisp = serviceFormBean.sendMessageString(FUW06301SFConst.KIKI_SEIZO_NO, X31CWebConst.DATABEAN_GET_VALUE);
		
		// 機器提供サービス契約情報を取得
		X31SDataBeanAccessArray comkktkSvcKeiInfo = commonInfoBean.getDataBeanArray(JFUWebCommon.KKTK_SVC_KEI_INFO);
		
		// C-CASカード番号(C-CASの機器製造番号)に紐づく機器提供サービス契約のサービス契約内訳番号取得
		String svcKeiUcwkNo = JFUWebCommon.getKktkSvcCdSvcUcwkNo(comkktkSvcKeiInfo, JFUStrConst.KK0771_KKTK_SVC_CD_C011, kikiSeizoNoDisp);

		//**********************************//
		// サービス処理
		//**********************************//

		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, FUSV_ID);

		// DataBean-BPマッピング
		FUSV0083_FUSV0083OPDBMapper mapper = new FUSV0083_FUSV0083OPDBMapper();

		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		HashMap<String, String> outputMap = new HashMap<String, String>();

		X31SDataBeanAccess[] paramBean = { serviceFormBean };
		mapper.setFUSV008301SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1, svcKeiUcwkNo);
		mapper.setFUSV008302SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV008303SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV008304SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV008305SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV008306SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV008309SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setWctrlOrderSendMap(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV008307SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV008308SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		/* ++++++++++ v3.00 開始終了 ++++++++++ */
		mapper.setFUSV008311SC(paramBean, inputMap);
		/* ++++++++++ v3.00 修正終了 ++++++++++ */
		mapper.setFUSV008310SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
			mapper.getFUSV008301SC(paramBean, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 例外判定
			setError(se);
		}

		// STB機器の契約状態判定
		chkOpSvcKeiListCount(serviceFormBean);

		// オプションチャンネルの契約状態判定
		chkOpSvcKeiStats(serviceFormBean);

		//**********************************//
		// 画面遷移
		//**********************************//

		// eo光テレビオプションチャンネル追加画面へ遷移
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW06303);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW06303);

		DEBUG_LOG.info("----- FUW06302 End mskm -----");

		return true;
	}

	/**
	 * 共有フォームBean設定値取得処理を行います。
	 * 
	 * @param commonInfoBean			共有フォームBean
	 * @param serviceFormBean			サービスフォームBean
	 * @throws JCCBusinessException	例外
	 */
	private void getCommonFormBean(X31SDataBeanAccess commonInfoBean, X31SDataBeanAccess serviceFormBean) throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW06302 Start getCommonFormBean -----");

		// 共有フォームBeanより値を取得しサービスフォームBeanに設定

		//**********************************//
		// ＳＳＯ情報
		//**********************************//

		// ＳＳＯ情報を取得
		X31SDataBeanAccess ssoInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);

		// ＳＳＯ情報.SYSIDを取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06302SFConst.SYSID, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(ssoInfo,
				CommonInfoCFConst.SYSID_21));

		// ＳＳＯ情報.サービス契約番号を取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06302SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(ssoInfo,
				CommonInfoCFConst.SVC_KEI_NO_21));

		//**********************************//
		// サービス契約情報
		//**********************************//

		// サービス契約情報を取得
		X31SDataBeanAccess svcKeiInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);

		// サービス契約情報.最終更新年月日時分秒を取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06302SFConst.LAST_UPD_DTM, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				svcKeiInfo, CommonInfoCFConst.LAST_UPD_DTM_23));

		//**********************************//
		// 機器提供サービス契約情報
		//**********************************//

		// 機器提供サービス契約情報を取得
		Map<String, String> condition = new HashMap<String, String>();
		condition.put(CommonInfoCFConst.KIKI_SEIZO_NO_27, serviceFormBean.sendMessageString(FUW06302SFConst.KIKI_SEIZO_NO_CCAS,
				X31CWebConst.DATABEAN_GET_VALUE));

		X31SDataBeanAccess kikiSvcKeiInfoBean = JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.KKTK_SVC_KEI_INFO, condition);

		// 機器提供サービス契約情報.サービス契約内訳番号を取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06302SFConst.SVC_KEI_UCWK_NO, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				kikiSvcKeiInfoBean, CommonInfoCFConst.SVC_KEI_UCWK_NO_27));

		// 機器提供サービス契約情報を取得
		Map<String, String> condition2 = new HashMap<String, String>();
		condition2.put(CommonInfoCFConst.SVC_KEI_UCWK_NO_27, serviceFormBean.sendMessageString(FUW06302SFConst.SVC_KEI_UCWK_NO,
				X31CWebConst.DATABEAN_GET_VALUE));
		condition2.put(CommonInfoCFConst.KKTK_SVC_CD_27, JFUStrConst.KK0771_KKTK_SVC_CD_C010);

		X31SDataBeanAccess kikiSvcKeiInfoBean2 =
				JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.KKTK_SVC_KEI_INFO, condition2);

		// 機器提供サービス契約情報から製造機器番号(BCAS)のデータを取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06302SFConst.KIKI_SEIZO_NO_BCAS, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				kikiSvcKeiInfoBean2, CommonInfoCFConst.KIKI_SEIZO_NO_27));

		// 機器提供サービス契約情報を取得
		Map<String, String> condition3 = new HashMap<String, String>();
		condition3.put(CommonInfoCFConst.SVC_KEI_UCWK_NO_27, serviceFormBean.sendMessageString(FUW06302SFConst.SVC_KEI_UCWK_NO,
				X31CWebConst.DATABEAN_GET_VALUE));
		condition3.put(CommonInfoCFConst.KKTK_SVC_CD_27, JFUStrConst.KK0771_KKTK_SVC_CD_C009);

		X31SDataBeanAccess kikiSvcKeiInfoBean3 =
				JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.KKTK_SVC_KEI_INFO, condition3);

		// 機器提供サービス契約情報から製造機器番号(BCAS)のデータを取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06302SFConst.KIKI_SEIZO_NO_STB, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				kikiSvcKeiInfoBean3, CommonInfoCFConst.KIKI_SEIZO_NO_27));
		
		// 機器提供サービス契約情報から製造機器番号(BCAS)のデータを取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06302SFConst.TAKNKIKI_MODEL_CD, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				kikiSvcKeiInfoBean3, CommonInfoCFConst.TAKNKIKI_MODEL_CD_27));

		/* ++++++++++ v3.00 修正開始 ++++++++++ */
		//**********************************//
		// サービス契約内訳情報
		//**********************************//
		// サービス契約内訳を取得
		Map<String, String> conditionSvcUcwk = new HashMap<String, String>();
		conditionSvcUcwk.put(CommonInfoCFConst.SVC_KEI_UCWK_NO_24, serviceFormBean.sendMessageString(FUW06302SFConst.SVC_KEI_UCWK_NO,
				X31CWebConst.DATABEAN_GET_VALUE));

		X31SDataBeanAccess svcKeiUcwkInfoBean = JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.SVC_KEI_UCWK_INFO, conditionSvcUcwk);
		
		// サービス契約内訳情報.料金コースコードを取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06302SFConst.UCWK_PCRS_CD, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				svcKeiUcwkInfoBean, CommonInfoCFConst.PCRS_CD_24));
		/* ++++++++++ v3.00 修正終了 ++++++++++ */
		
		//**********************************//
		// 請求契約情報
		//**********************************//

		// 請求契約情報の取得
		X31SDataBeanAccess seikyKeiInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SEIKY_KEI_INFO);

		// 請求契約情報.請求契約番号を取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW06302SFConst.SEIKY_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				seikyKeiInfo, CommonInfoCFConst.SEIKY_KEI_NO_32));

		DEBUG_LOG.info("----- FUW06302 End getCommonFormBean -----");
	}

	/**
	 * オプションチャンネル契約状態一覧件数チェック処理を行います。
	 * 
	 * @param serviceFormBean			サービスフォームBean
	 */
	private void chkOpSvcKeiListCount(X31SDataBeanAccess serviceFormBean)
	{
		DEBUG_LOG.info("----- FUW06302 Start chkOpSvcKeiListCount -----");

		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelKeiList = serviceFormBean.getDataBeanArray(FUW06302SFConst.OP_CHANELL_KEI_STAT_LIST);

		// オプションサービス契約リストにデータがない場合
		if (opChannelKeiList.getCount() == 0)
		{
			DEBUG_LOG.info("■■■FUW06302 (1)オプションチャンネル契約状態一覧：契約状態エラー■■■");
			// 業務共通例外クラス："0102"（契約状態エラー）
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		DEBUG_LOG.info("----- FUW06302 Start chkOpSvcKeiListCount -----");
	}

	/**
	 * オプションチャンネル契約状態チェック処理を行います。
	 * 
	 * @param serviceFormBean			サービスフォームBean
	 */
	private void chkOpSvcKeiStats(X31SDataBeanAccess serviceFormBean)
	{
		DEBUG_LOG.info("----- FUW06302 Start chkOpSvcKeiStats -----");

		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelKeiList = serviceFormBean.getDataBeanArray(FUW06302SFConst.OP_CHANELL_KEI_STAT_LIST);

		// オプションチャンネルの契約状態判定
		for (int i = 0; i < opChannelKeiList.getCount(); ++i)
		{
			// チャンネル情報を取得
			X31SDataBeanAccess channelBean = opChannelKeiList.getDataBean(i);

			// 申込対象のオプションサービスコードとリストのオプションサービスコードが同じ場合
			if (serviceFormBean.sendMessageString(FUW06302SFConst.OP_SVC_CD, X31CWebConst.DATABEAN_GET_VALUE).equals(
					channelBean.sendMessageString(FUW06302SFConst.OP_SVC_CD_01, X31CWebConst.DATABEAN_GET_VALUE)))
			{
				// オプションサービス契約ステータスが""(空白)または"910"(解約済)以外の場合
				if (!JFUStrConst.EMPTY.equals(channelBean.sendMessageString(FUW06302SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE))
						&& !JFUStrConst.CD00037_910.equals(channelBean.sendMessageString(FUW06302SFConst.OP_SVC_KEI_STAT_01,
								X31CWebConst.DATABEAN_GET_VALUE)))
				{
					// 業務共通例外クラス："0201"（お客様情報変更エラー）
					DEBUG_LOG.info("■■■FUW06302 (2)オプションチャンネルの契約状態判定エラー(お客様情報変更エラー)(オプションサービス契約ステータス："
							+ channelBean.sendMessageString(FUW06302SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE) + ")");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0201);
				}
			}
		}

		DEBUG_LOG.info("----- FUW06302 End chkOpSvcKeiStats -----");
	}

	/**
	 * 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();
	}

	/**
	 * 例外情報処理を行います。
	 * 
	 * @param se	JCCWebServiceException
	 */
	private void setError(JCCWebServiceException se)
	{
		DEBUG_LOG.info("----- FUW06302 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"（内部スキーマ関連チェックエラーの場合
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{
			// テンプレートIDが"EKK0381D010"(オプションサービス契約登録)の場合
			if (TEMPLATE_ID_OP_SVC_KEI_ADD.equals(templateid))
			{
				// 関連チェックエラーフラグが"EA"または"EB"の場合
				if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) || JFUStrConst.RELATION_CHECK_ERR_EB.equals(errFlg))
				{
					// アイテムIDが"svc_kei_no"(サービス契約番号)、または"svc_kei_ucwk_no"(サービス契約内訳番号)の場合
					if (ITEM_ID_SVC_KEI_NO.equals(itemid) || ITEM_ID_SVC_KEI_UCWK_NO.equals(itemid))
					{
						// 業務共通例外クラス："0102"(契約状態エラー)
						DEBUG_LOG.info("■■■FUW06302 (3)サービスIF実行エラー(EKK0381D010)");
						throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
					}
				}
			}

			/* ++++++++++ v3.00 修正開始 ++++++++++ */
			// テンプレートIDが"EKK0811A010"(料金コース_オプションサービス一意照会)の場合
			if (TEMPLATE_ID_PRCS_OP_SVC.equals(templateid))
			{
				// 関連チェックエラーフラグが"EA"の場合
				if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg))
				{
					// アイテムIDが"op_svc_cd"(オプションサービスコード)の場合
					if (ITEM_ID_OP_SVC_CD.equals(itemid))
					{
						// 業務共通例外クラス："0201"(お客様情報変更エラー)
						DEBUG_LOG.info("■■■FUW06302 (4)サービスIF実行エラー(EKK0821B002) --オプションチャンネル重複チェックエラー");
						throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0201);
					}
				}
			}
			/* ++++++++++ v3.00 修正終了 ++++++++++ */
			
			// アイテムIDが"upd_dtm_bf"(更新年月日時分秒(更新前))の場合
			if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && ITEM_ID_UPD_DTM_BF.equals(itemid))
			{
				// 業務共通例外クラス："0201"（お客様情報変更エラー）
				DEBUG_LOG.info("■■■FUW06302 (5)サービス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("■■■FUW06302 (6)サービスIF実行エラー(異動予約エラー)");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}
			}
		}

		// 業務共通例外クラス："0002"（システムエラー）
		DEBUG_LOG.info("■■■FUW06302 (7)サービスIF実行エラー(システムエラー)");
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
	}

	/**
	 * スターチャンネルチェック処理を行います。
	 * 
	 * @param serviceFormBean	サービスフォームBean
	 * @return true:スターチャンネル false:スターチャンネル以外
	 * @throws Exception
	 */
	private Boolean chkStarChannel(X31SDataBeanAccess serviceFormBean) throws Exception
	{
		DEBUG_LOG.info("----- FUW06302 Start chkStarChannel -----");

		Boolean starChannelFlg = false;

		// チェック対象のオプションサービスコード
		String checkOpSvcCd = serviceFormBean.sendMessageString(FUW06302SFConst.OP_SVC_CD, X31CWebConst.DATABEAN_GET_VALUE);

		// プロパティよりスターチャンネルオプションサービスコードを取得
		String starChannel = JFUWebCommon.getDispItem(STAR_CHANNEL_QUERY_CTL);
		String[] starChannelOpSvcCd = starChannel.split(COMMA);

		// チェック対象のオプションサービスコードがスターチャンネルであるかチェック
		for (int i = 0; i < starChannelOpSvcCd.length; ++i)
		{
			// チェック対象のオプションサービスコードがスターチャンネルの場合
			if (checkOpSvcCd.equals(starChannelOpSvcCd[i]))
			{
				starChannelFlg = true;
				break;
			}
		}

		DEBUG_LOG.info("----- FUW06302 End chkStarChannel -----");

		return starChannelFlg;
	}

	/**
	 * スターチャンネル文言編集処理を行います。
	 * 
	 * @param serviceFormBean	サービスフォームBean
	 * @return スターチャンネル文言
	 * @throws Exception
	 */
	private String setStarChannel(X31SDataBeanAccess serviceFormBean) throws Exception
	{
		DEBUG_LOG.info("----- FUW06302 Start setStarChannel -----");

		String starChannelText = JFUStrConst.EMPTY;

		// 月額料金
		String prc = serviceFormBean.sendMessageString(FUW06302SFConst.PRC, X31CWebConst.DATABEAN_GET_VALUE);

		// プロパティよりスターチャンネルオプションサービスコードを取得
		String starChannel = JFUWebCommon.getDispItem(STAR_CHANNEL_TEXT);
		starChannelText = starChannel.replace(REPLACE_1, prc);

		DEBUG_LOG.info("----- FUW06302 End setStarChannel -----");

		return starChannelText;
	}

	/**
	 * 機器提供サービス契約状態チェック処理を行います。
	 * 
	 * @param serviceFormBean			サービスフォームBean
	 * @throws JCCBusinessException	例外
	 * */
	private void chkKikiSvcKey(X31SDataBeanAccess serviceFormBean) throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW06302 Start chkKikiSvcKey -----");

		// STB機器の契約状態判定
		Map<String, String> resultMap =
				JFUWebCommon.checkTvCcasKikiStatus(this, serviceFormBean.sendMessageString(FUW06302SFConst.KIKI_SEIZO_NO_CCAS,
						X31CWebConst.DATABEAN_GET_VALUE), null);

		if (RTN_RESULT_NG.equals(resultMap.get(RTN_RESULT)))
		{
			// 業務共通例外クラス："0102"（契約状態エラー）
			DEBUG_LOG.info("■■■FUW06302 (8)STB契約状態チェックエラー(契約状態エラー)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		DEBUG_LOG.info("----- FUW06302 End chkKikiSvcKey -----");
	}

}