/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：顧客契約
*	モジュール名	：KKW00849SFLogic
*	ソースファイル名：KKW00849SFLogic.java
*	作成者			：藤井
*	日付			：2018年09月29日
*＜機能概要＞
*	おうちの機器補償登録のビューロジッククラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00		2018/09/29	藤井		新規作成
**********************************************************************/
package eo.web.webview.KKW00849SF;

import java.text.ParseException;
import java.util.HashMap;

import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JPCDateUtil;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JKKCommonConst;
import eo.web.webview.common.JKKScreenConst;
import eo.web.webview.mapping.KKSV0917_KKSV0917OPDBMapper;
import eo.web.webview.mapping.KKSV0918_KKSV0918OPDBMapper;


/**
 * <dd>クラス名：おうちの機器補償登録ビューロジック
 * <dd>クラス説明：画面上のボタン押下時の各処理を記述します。
 * <dd>備考：
 */
@SuppressWarnings("serial")
public class KKW00849SFLogic extends JCCWebBusinessLogic
{
	/** PCプラン（メッセージ埋込文字用） */
	private static final String PC_PLAN = "ＰＣプラン";
	/** TVプラン（メッセージ埋込文字用） */
	private static final String TV_PLAN = "ＴＶプラン";

	/**
	 * 初期表示処理
	 * @return 正常終了:true 異常終了:false
	 * @throws Exception 例外が発生した場合
	 */
	public boolean actionInit() throws Exception
	{
		//サービスフォームBean アクセスクラスの取得
		X31SDataBeanAccess svcFormBean = super.getServiceFormBean();

		// セッション情報取得
		getSessionData(svcFormBean);

		// サービスフォームBean初期化
		initServiceFormBean(svcFormBean);
		
		// サービス呼出
		executeInitSvc(svcFormBean);
		
		// DataBean項目間の同期編集（下り）
		refleshBeanDown(svcFormBean);

		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);

		//共有Bean アクセスクラスの取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// 画面ID・画面名の設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW00849);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW00849);
		return true;
	}

	/**
	 * 登録画面「戻る」ボタン押下時処理
	 * @return 正常終了:true 異常終了:false
	 * @throws Exception 
	 */
	public boolean actionBack()
	{
		///// 共有フォームBean設定（遷移先画面） /////
		X31SDataBeanAccess commonBean = super.getCommonInfoBean();
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon.getScreenId(this));
		
		return true;
	}
	
	/**
	 * 登録画面「登録確認」ボタン押下時処理
	 * <br>
	 * @param  funcCode 機能コード
	 * @return 正常終了:true 異常終了:false
	 */
	public boolean actionUpdcfm() throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess svcFormBean = super.getServiceFormBean();
		
		// DataBean項目間の同期編集（上り）
		refleshBeanUp(svcFormBean);
		
		// 入力チェック
		if(!inputCheck(svcFormBean)){
			return false;
		}

		// サービス呼出
		invokeCfmService(svcFormBean, JPCModelConstant.FUNC_CD_2);

		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		//共有Bean アクセスクラスの取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// メッセージ表示用
		String[] msgInfo = {"おうちの機器補償オプション情報の登録"};
		// メッセージ出力
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0370__I, msgInfo);
		// 画面ID・画面名の設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW00850);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW00850);
		return true;
	}

	
	/**
	 * 登録確認画面「確定」ボタン押下時処理
	 * @return 正常終了:true 異常終了:false
	 * @throws Exception
	 */
	public boolean actionFix() throws Exception
	{
		
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess svcFormBean = super.getServiceFormBean();
		
		// サービス呼出
		invokeCfmService(svcFormBean, JPCModelConstant.FUNC_CD_1);

		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);

		//共有Bean アクセスクラスの取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// メッセージ表示用
		String[] msgInfo = {"おうちの機器補償オプション情報の登録"};
		// メッセージ出力
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB4390__I, msgInfo);
		// 画面ID・画面名の設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW00851);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW00851);
		return true;
	}
	
	
	/**
	 * 登録確認画面「修正」ボタン押下時処理
	 * @return 正常終了:true 異常終了:false
	 */
	public boolean actionSyuse()
	{
		///// 共有フォームBean設定（遷移先画面） /////
		X31SDataBeanAccess commonBean = super.getCommonInfoBean();
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW00849);
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW00849);
		
		return true;
	}
	
	
	/**
	 * 登録完了画面「完了」ボタン押下時処理
	 * @return 正常終了:true 異常終了:false
	 * @throws Exception 
	 */
	public boolean actionFin() throws Exception
	{
		///// 共有フォームBean設定（遷移先画面） /////
		X31SDataBeanAccess commonBean = super.getCommonInfoBean();
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW02301);
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW02301);
		
		return true;
	}
	
	
	/** セッション情報をDataBeanへ設定します。 */
	private void getSessionData(X31SDataBeanAccess svcFormBean)
	{
		// 引継ぎデータ
		JCCWebCommon.getScreenInfo(this);

		// 顧客契約引継リストの取得
		X31SDataBeanAccessArray cust_kei_hktgi_list = svcFormBean.getDataBeanArray(KKW00849SFConst.CUST_KEI_HKTGI_LIST);
		X31SDataBeanAccess subbean = cust_kei_hktgi_list.getDataBean(0);
		

		// 個別引継ぎ情報に格納
		// SYSID
		svcFormBean.sendMessageString(KKW00849SFConst.SYSID, X31CWebConst.DATABEAN_SET_VALUE, 
				subbean.sendMessageString(KKW00849SFConst.SYSID_01, X31CWebConst.DATABEAN_GET_VALUE)
		);
		// サービス契約番号
		svcFormBean.sendMessageString(KKW00849SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, 
				subbean.sendMessageString(KKW00849SFConst.SVC_KEI_NO_01, X31CWebConst.DATABEAN_GET_VALUE)
		);
		// 異動区分
		svcFormBean.sendMessageString(KKW00849SFConst.IDO_DIV, X31CWebConst.DATABEAN_SET_VALUE, 
				subbean.sendMessageString(KKW00849SFConst.IDO_DIV_01, X31CWebConst.DATABEAN_GET_VALUE)
		);
		// 異動理由コード
		int count = (Integer)subbean.sendMessage(KKW00849SFConst.IDO_RSN_CD_01, X31CWebConst.DATABEAN_GET_COUNT);
		for(int i = 0 ; i < count; i ++){
			svcFormBean.sendMessageString(KKW00849SFConst.IDO_RSN_CD, X31CWebConst.DATABEAN_ADD_VALUE, 
				subbean.sendMessageString(KKW00849SFConst.IDO_RSN_CD_01, X31CWebConst.DATABEAN_GET_VALUE, i)
			);
		}
		// 異動理由メモ
		svcFormBean.sendMessageString(KKW00849SFConst.IDO_RSN_MEMO, X31CWebConst.DATABEAN_SET_VALUE, 
				subbean.sendMessageString(KKW00849SFConst.IDO_RSN_MEMO_01, X31CWebConst.DATABEAN_GET_VALUE)
		);

		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);

	}
	
	/** DataBeanの初期設定を行います。 */
	private void initServiceFormBean(X31SDataBeanAccess svcFormBean)
	{
		// 申込日（年）初期値
		svcFormBean.sendMessageString(KKW00849SFConst.INIT_MSKM_YEAR, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon.getOpeDate(this, null).substring(0,4));
		// 申込日（月）初期値
		svcFormBean.sendMessageString(KKW00849SFConst.INIT_MSKM_MON, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon.getOpeDate(this, null).substring(4, 6));
		// 申込日（日）初期値
		svcFormBean.sendMessageString(KKW00849SFConst.INIT_MSKM_DAY, X31CWebConst.DATABEAN_SET_VALUE,  JCCWebCommon.getOpeDate(this, null).substring(6, 8));
		
		
		// ＰＣプラン申込
		svcFormBean.sendMessageBoolean(KKW00849SFConst.PC_PLAN_BTN, X31CWebConst.DATABEAN_SET_VALUE, false);
		// ＰＣワイドプラン有無コード
		svcFormBean.sendMessageString(KKW00849SFConst.PC_PLAN_UM_CD, X31CWebConst.DATABEAN_SET_VALUE, JKKStrConst.CD_DIV_UM_NASHI);
		// ＰＣプラン申込日
		svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_YMD, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon.getOpeDate(this, null));
		// ＴＶプラン申込
		svcFormBean.sendMessageBoolean(KKW00849SFConst.TV_PLAN_BTN, X31CWebConst.DATABEAN_SET_VALUE, false);
		// ＴＶプラン申込日
		svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_YMD, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon.getOpeDate(this, null));
	}
	
	/** DataBean項目間の同期編集（下り）を行います。 */
	private void refleshBeanDown(X31SDataBeanAccess svcFormBean) 
	{
		// PCプラン有無リスト
		setPulldownIndex(svcFormBean, KKW00849SFConst.PC_PLAN_UM_LIST, svcFormBean.sendMessageString(KKW00849SFConst.PC_PLAN_UM_CD, X31CWebConst.DATABEAN_GET_VALUE));
		// ＰＣワイドプラン有無名
		svcFormBean.sendMessageString(KKW00849SFConst.PC_PLAN_UM_NAME, X31CWebConst.DATABEAN_SET_VALUE, 
			getPulldownCdNm(svcFormBean, KKW00849SFConst.PC_PLAN_UM_LIST)
		);
		
		String pcMskmYmd = svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_YMD, X31CWebConst.DATABEAN_GET_VALUE);
		if(!StringUtils.isEmpty(pcMskmYmd) && pcMskmYmd.length() >= 8){
			// ＰＣプラン申込日（年）
			svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_YEAR, X31CWebConst.DATABEAN_SET_VALUE, pcMskmYmd.substring(0, 4));
			// ＰＣプラン申込日（月）
			svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_MON, X31CWebConst.DATABEAN_SET_VALUE, pcMskmYmd.substring(4, 6));
			// ＰＣプラン申込日（日）
			svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_DAY, X31CWebConst.DATABEAN_SET_VALUE, pcMskmYmd.substring(6, 8));
		}else{
			// ＰＣプラン申込日（年）
			svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_YEAR, X31CWebConst.DATABEAN_SET_VALUE, "");
			// ＰＣプラン申込日（月）
			svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_MON, X31CWebConst.DATABEAN_SET_VALUE, "");
			// ＰＣプラン申込日（日）
			svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_DAY, X31CWebConst.DATABEAN_SET_VALUE, "");
		}
		String tvMskmYmd = svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_YMD, X31CWebConst.DATABEAN_GET_VALUE);
		if(!StringUtils.isEmpty(tvMskmYmd) && tvMskmYmd.length() >= 8){
			// ＴＶプラン申込日（年）
			svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_YEAR, X31CWebConst.DATABEAN_SET_VALUE, tvMskmYmd.substring(0, 4));
			// ＴＶプラン申込日（月）
			svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_MON, X31CWebConst.DATABEAN_SET_VALUE, tvMskmYmd.substring(4, 6));
			// ＴＶプラン申込日（日）
			svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_DAY, X31CWebConst.DATABEAN_SET_VALUE, tvMskmYmd.substring(6, 8));
		}else{
			// ＴＶプラン申込日（年）
			svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_YEAR, X31CWebConst.DATABEAN_SET_VALUE, "");
			// ＴＶプラン申込日（月）
			svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_MON, X31CWebConst.DATABEAN_SET_VALUE, "");
			// ＴＶプラン申込日（日）
			svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_DAY, X31CWebConst.DATABEAN_SET_VALUE, "");
		}
	}

	/** DataBean項目間の同期編集（上り）を行います。 */
	private void refleshBeanUp(X31SDataBeanAccess svcFormBean) 
	{
		// ＰＣワイドプラン有無コード
		svcFormBean.sendMessageString(KKW00849SFConst.PC_PLAN_UM_CD, X31CWebConst.DATABEAN_SET_VALUE, 
			getPulldownCdDiv(svcFormBean, KKW00849SFConst.PC_PLAN_UM_LIST)
		);
		// ＰＣワイドプラン有無名
		svcFormBean.sendMessageString(KKW00849SFConst.PC_PLAN_UM_NAME, X31CWebConst.DATABEAN_SET_VALUE, 
			getPulldownCdNm(svcFormBean, KKW00849SFConst.PC_PLAN_UM_LIST)
		);
		
		// ＰＣプラン申込日
		String pcMskmYear = svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_YEAR, X31CWebConst.DATABEAN_GET_VALUE);
		String pcMskmMon = svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_MON, X31CWebConst.DATABEAN_GET_VALUE);
		String pcMskmDay = svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_DAY, X31CWebConst.DATABEAN_GET_VALUE);
		svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_YMD, X31CWebConst.DATABEAN_SET_VALUE, pcMskmYear + pcMskmMon + pcMskmDay);
		
		// ＴＶプラン申込日
		String tvMskmYear = svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_YEAR, X31CWebConst.DATABEAN_GET_VALUE);
		String tvMskmMon = svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_MON, X31CWebConst.DATABEAN_GET_VALUE);
		String tvMskmDay = svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_DAY, X31CWebConst.DATABEAN_GET_VALUE);
		svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_YMD, X31CWebConst.DATABEAN_SET_VALUE, tvMskmYear + tvMskmMon + tvMskmDay);
	}


	/** 入力チェックを行います。 */
	private boolean inputCheck(X31SDataBeanAccess svcFormBean) {
		
		// 未来日チェック
		if(!checkMskmYmdFutureDate(svcFormBean)){
			return false;
		}
		
		// 過去日チェック
		if(!checkMskmYmdPastDate(svcFormBean)){
			return false;
		}
		
		// 状態チェック
		if(!checkKaihkAble(svcFormBean)){
			return false;
		}
		
		// 再登録10ヶ月チェック
		if(!checkReadd(svcFormBean)){
			return false;
		}
		
		// 追加時サービス契約ステータスチェック
		if(!checkSvcKeiStat(svcFormBean)){
			return false;
		}
		
		// 安心補償オプションチェック
		if(!checkTnmtHosho(svcFormBean)){
			return false;
		}
		
		// 住所変更中チェック
		if(!checkAdChg(svcFormBean)){
			return false;
		}
		
		return true;
	}

	/** 申込日の未来日チェックを行います。 */
	private boolean checkMskmYmdFutureDate(X31SDataBeanAccess svcFormBean) {
		// 運要日付取得
		String opeDate = JCCWebCommon.getOpeDate(this, null);
		
		if(isPcPlanCheck(svcFormBean)){
			String pcMskmYmd = svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_YMD, X31CWebConst.DATABEAN_GET_VALUE);
			// 運用日付より未来日が指定された場合はエラー
			if(!StringUtils.isEmpty(pcMskmYmd) && opeDate.compareTo(pcMskmYmd) < 0){
				JCCWebCommon.setMessageInfo(this, "EKB4670-NW", new String[]{"申込日"}, "pc_mskm_year");
				JCCWebCommon.setMessageInfo(this, "EKB4670-NW", new String[]{"申込日"}, "pc_mskm_mon");
				JCCWebCommon.setMessageInfo(this, "EKB4670-NW", new String[]{"申込日"}, "pc_mskm_day");
				return false;
			}
		}
		
		if(isTvPlanCheck(svcFormBean)){
			String tvMskmYmd = svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_YMD, X31CWebConst.DATABEAN_GET_VALUE);
			// 運用日付より未来日が指定された場合はエラー
			if(!StringUtils.isEmpty(tvMskmYmd) && opeDate.compareTo(tvMskmYmd) < 0){
				JCCWebCommon.setMessageInfo(this, "EKB4670-NW", new String[]{"申込日"}, "tv_mskm_year");
				JCCWebCommon.setMessageInfo(this, "EKB4670-NW", new String[]{"申込日"}, "tv_mskm_mon");
				JCCWebCommon.setMessageInfo(this, "EKB4670-NW", new String[]{"申込日"}, "tv_mskm_day");
				return false;
			}
		}
		return true;
	}

	/** 申込日の過去日チェックを行います。 */
	private boolean checkMskmYmdPastDate(X31SDataBeanAccess svcFormBean) {
		// 運要日付取得
		String opeDate = JCCWebCommon.getOpeDate(this, null);
		// 運用日付-1ヶ月
		String opeMinus1Month;
		try {
			opeMinus1Month = JPCDateUtil.addMonth(opeDate, -1);
		} catch (ParseException e) {
			// 万が一パースエラー時は一旦正常に倒す
			return true;
		}
		
		if(isPcPlanCheck(svcFormBean)){
			String pcMskmYmd = svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_YMD, X31CWebConst.DATABEAN_GET_VALUE);
			// 運用日付-1ヶ月より過去日が指定された場合はエラー
			if(!StringUtils.isEmpty(pcMskmYmd) && pcMskmYmd.compareTo(opeMinus1Month) < 0){
				JCCWebCommon.setMessageInfo(this, "EKB0690-NW", new String[]{"申込日","-1ヶ月以上"}, "pc_mskm_year");
				JCCWebCommon.setMessageInfo(this, "EKB0690-NW", new String[]{"申込日","-1ヶ月以上"}, "pc_mskm_mon");
				JCCWebCommon.setMessageInfo(this, "EKB0690-NW", new String[]{"申込日","-1ヶ月以上"}, "pc_mskm_day");
				return false;
			}
		}
		
		if(isTvPlanCheck(svcFormBean)){
			String tvMskmYmd = svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_YMD, X31CWebConst.DATABEAN_GET_VALUE);
			// 運用日付-1ヶ月より過去日が指定された場合はエラー
			if(!StringUtils.isEmpty(tvMskmYmd) && tvMskmYmd.compareTo(opeMinus1Month) < 0){
				JCCWebCommon.setMessageInfo(this, "EKB0690-NW", new String[]{"申込日","-1ヶ月以上"}, "tv_mskm_year");
				JCCWebCommon.setMessageInfo(this, "EKB0690-NW", new String[]{"申込日","-1ヶ月以上"}, "tv_mskm_mon");
				JCCWebCommon.setMessageInfo(this, "EKB0690-NW", new String[]{"申込日","-1ヶ月以上"}, "tv_mskm_day");
				return false;
			}
		}
		
		return true;
	}
	
	/** 回復可能オプションが存在するか状態チェックを行います。 */
	private boolean checkKaihkAble(X31SDataBeanAccess svcFormBean) {
		
		if(isPcPlanCheck(svcFormBean)){
			String pcKaihkOpSvcKeiNo = svcFormBean.sendMessageString(KKW00849SFConst.PC_KAIHK_OP_SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE);
			// 回復可能(申込連携済でかつ解約連携・キャンセル連携が未連携)なＰＣプラン・ＴＶプランが存在する場合に、新たにＰＣプラン・ＴＶプランを登録しようとした時、エラーとする。
			// 回復可能オプションサービス契約番号が設定されていればエラー
			if(!StringUtils.isEmpty(pcKaihkOpSvcKeiNo)){
				JCCWebCommon.setMessageInfo(this, "EKB5420-JW", new String[]{PC_PLAN,"回復可能なデータが存在するため、登録"}, "pc_plan_btn");
				return false;
			}
		}
		
		if(isTvPlanCheck(svcFormBean)){
			String tvKaihkOpSvcKeiNo = svcFormBean.sendMessageString(KKW00849SFConst.TV_KAIHK_OP_SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE);
			// 回復可能(申込連携済でかつ解約連携・キャンセル連携が未連携)なＰＣプラン・ＴＶプランが存在する場合に、新たにＰＣプラン・ＴＶプランを登録しようとした時、エラーとする。
			// 回復可能オプションサービス契約番号が設定されていればエラー
			if(!StringUtils.isEmpty(tvKaihkOpSvcKeiNo)){
				JCCWebCommon.setMessageInfo(this, "EKB5420-JW", new String[]{TV_PLAN,"回復可能なデータが存在するため、登録"}, "tv_plan_btn");
				return false;
			}
		}
		
		return true;
	}
	
	/** 再登録10ヶ月チェックを行います。 */
	private boolean checkReadd(X31SDataBeanAccess svcFormBean) {
		
		if(isPcPlanCheck(svcFormBean)){
			String pcMskmYmd = svcFormBean.sendMessageString(KKW00849SFConst.PC_MSKM_YMD, X31CWebConst.DATABEAN_GET_VALUE);
			String pcReaddYmd = svcFormBean.sendMessageString(KKW00849SFConst.PC_READD_YMD, X31CWebConst.DATABEAN_GET_VALUE);
			
			// 解約連携されたＰＣプラン・ＴＶプランが存在する場合に、申込日を基準とし、解約連携後の課金終了月を含む10ヶ月を経過していない時、エラーとする。
			// 再登録可能年月日より前はエラー
			if(!StringUtils.isEmpty(pcMskmYmd) && !StringUtils.isEmpty(pcReaddYmd) && pcMskmYmd.compareTo(pcReaddYmd) < 0){
				JCCWebCommon.setMessageInfo(this, "EKB5420-JW", new String[]{PC_PLAN,"解約連携後10ヶ月を経過していないため、登録"}, "pc_mskm_year");
				JCCWebCommon.setMessageInfo(this, "EKB5420-JW", new String[]{PC_PLAN,"解約連携後10ヶ月を経過していないため、登録"}, "pc_mskm_mon");
				JCCWebCommon.setMessageInfo(this, "EKB5420-JW", new String[]{PC_PLAN,"解約連携後10ヶ月を経過していないため、登録"}, "pc_mskm_day");
				return false;
			}
		}
		
		if(isTvPlanCheck(svcFormBean)){
			String tvMskmYmd = svcFormBean.sendMessageString(KKW00849SFConst.TV_MSKM_YMD, X31CWebConst.DATABEAN_GET_VALUE);
			String tvReaddYmd = svcFormBean.sendMessageString(KKW00849SFConst.TV_READD_YMD, X31CWebConst.DATABEAN_GET_VALUE);
			
			// 解約連携されたＰＣプラン・ＴＶプランが存在する場合に、申込日を基準とし、解約連携後の課金終了月を含む10ヶ月を経過していない時、エラーとする。
			// 再登録可能年月日より前はエラー
			if(!StringUtils.isEmpty(tvMskmYmd) && !StringUtils.isEmpty(tvReaddYmd) && tvMskmYmd.compareTo(tvReaddYmd) < 0){
				JCCWebCommon.setMessageInfo(this, "EKB5420-JW", new String[]{TV_PLAN,"解約連携後10ヶ月を経過していないため、登録"}, "tv_mskm_year");
				JCCWebCommon.setMessageInfo(this, "EKB5420-JW", new String[]{TV_PLAN,"解約連携後10ヶ月を経過していないため、登録"}, "tv_mskm_mon");
				JCCWebCommon.setMessageInfo(this, "EKB5420-JW", new String[]{TV_PLAN,"解約連携後10ヶ月を経過していないため、登録"}, "tv_mskm_day");
				return false;
			}
		}
		
		return true;
	}

	/** サービス契約ステータスチェックを行います。 */
	private boolean checkSvcKeiStat(X31SDataBeanAccess svcFormBean) {
		// ＰＣプラン・ＴＶプランを追加する場合、サービス契約ステータスが「休止・中断中」、「停止中」、「解約済」、「キャンセル済」の場合はエラー。
		if(isPcPlanCheck(svcFormBean) || isTvPlanCheck(svcFormBean)){
			String svcKeiStat = svcFormBean.sendMessageString(KKW00849SFConst.SVC_KEI_STAT, X31CWebConst.DATABEAN_GET_VALUE);
			if( JKKStrConst.CD00037_STAT_PAUSE.equals(svcKeiStat)
				|| JKKStrConst.CD00037_STAT_STP.equals(svcKeiStat)
				|| JKKStrConst.CD00037_DSL_ZM.equals(svcKeiStat)
				|| JKKStrConst.CD00037_CANCEL_ZM.equals(svcKeiStat)
			){
				JCCWebCommon.setMessageInfo(this, "EKB1510-KW", new String[]{"追加","サービス"});
				return false;
			}
		}
		
		return true;
	}

	/** 端末補償オプション存在チェックを行います。 */
	private boolean checkTnmtHosho(X31SDataBeanAccess svcFormBean) {
		// ＰＣプラン・ＴＶプランを申込時、安心補償オプションが申込されている場合、エラーとする。
		if(isPcPlanCheck(svcFormBean) || isTvPlanCheck(svcFormBean)){
			String tnmtHoshoKkopSvcKeiNo = svcFormBean.sendMessageString(KKW00849SFConst.TNMT_HOSHO_KKOP_SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE);
			// 安心補償機器オプションサービス契約番号が設定されていればエラー
			if(!StringUtils.isEmpty(tnmtHoshoKkopSvcKeiNo)){
				JCCWebCommon.setMessageInfo(this, "EKBF200-KW", new String[]{""});
				return false;
			}
		}
		
		return true;
	}
	
	/** 住所変更中転居先チェックを行います。 */
	private boolean checkAdChg(X31SDataBeanAccess svcFormBean) {
		
		boolean adChgFlg = svcFormBean.sendMessageBoolean(KKW00849SFConst.AD_CHG_FLG, X31CWebConst.DATABEAN_GET_VALUE);
		// ＰＣプラン・ＴＶプランを申込時、住所変更中(住所変更ステータス<>"003:完了済")でかつ住所変更先の場合、エラーとする。
		if(isPcPlanCheck(svcFormBean)){
			if(adChgFlg){
				JCCWebCommon.setMessageInfo(this, "EKB5420-JW", new String[]{PC_PLAN, "住所変更確定前の住所変更先のため、登録"}, "pc_plan_btn");
				return false;
			}
		}
		
		if(isTvPlanCheck(svcFormBean)){
			if(adChgFlg){
				JCCWebCommon.setMessageInfo(this, "EKB5420-JW", new String[]{TV_PLAN, "住所変更確定前の住所変更先のため、登録"}, "tv_plan_btn");
				return false;
			}
		}
		return true;
	}
	
	
	/** PCプラン関連項目がチェック対象であるか判定します。
	 * @return チェック対象の場合true, 以外はfalse
	 *  */
	private boolean isPcPlanCheck(X31SDataBeanAccess svcFormBean) {
		boolean isPcCheck = false;
		String pcOpSvcKeiNo = svcFormBean.sendMessageString(KKW00849SFConst.PC_OP_SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE);
		boolean pcPlanBtn = svcFormBean.sendMessageBoolean(KKW00849SFConst.PC_PLAN_BTN, X31CWebConst.DATABEAN_GET_VALUE);
		
		// 既設契約なしでPCプランが申し込まれている場合チェック実施
		if(StringUtils.isEmpty(pcOpSvcKeiNo) && pcPlanBtn){
			isPcCheck = true;
		}
		return isPcCheck;
	}

	/** TVプラン関連項目がチェック対象であるか判定します。
	 * @return チェック対象の場合true, 以外はfalse
	 *  */
	private boolean isTvPlanCheck(X31SDataBeanAccess svcFormBean) {
		boolean isPcCheck = false;
		String tvOpSvcKeiNo = svcFormBean.sendMessageString(KKW00849SFConst.TV_OP_SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE);
		boolean tvPlanBtn = svcFormBean.sendMessageBoolean(KKW00849SFConst.TV_PLAN_BTN, X31CWebConst.DATABEAN_GET_VALUE);
		
		// 既設契約なしでTVプランが申し込まれている場合チェック実施
		if(StringUtils.isEmpty(tvOpSvcKeiNo) && tvPlanBtn){
			isPcCheck = true;
		}
		return isPcCheck;
	}

	/** おうちの機器補償登録初期表示サービス実行処理 */
	private void executeInitSvc(X31SDataBeanAccess svcFormBean) throws Exception
	{
		X31SDataBeanAccess[] paramBean = {svcFormBean};
		
		// サービスの呼び出し
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		// サービスパラメタ設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JKKCommonConst.UCID_KKSV0917);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, JKKCommonConst.OPID_KKSV0917OP);
		
		// 上りマッピング(サービス項目-DataBean項目マッピング)
		KKSV0917_KKSV0917OPDBMapper mapper = new KKSV0917_KKSV0917OPDBMapper();
		
		// おうちの機器補償登録画面 初期表示CC
		inputMap = mapper.setKKSV091701CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		
		// サービス呼び出し
		invokeService(paramMap, inputMap, outputMap);
		
		// 取得情報の下りマッピング
		mapper.getKKSV091701CC(paramBean, outputMap);
		

	}
	
	/** 登録確認サービスを実行します。 */
	private void invokeCfmService(X31SDataBeanAccess svcFormBean, String funcCode)
	{
		// HashMap定義
		HashMap<String, Object> paramMap = new HashMap<String, Object>();		//パラメタマップ生成
		HashMap<String, Object> inputMap = new HashMap<String, Object>();		//インプットマップ生成
		HashMap<String, Object> outputMap = new HashMap<String, Object>();		//アウトプットマップ生成

		// サービスフォームBean アクセスクラスの取得
		X31SDataBeanAccess[] paramBean = {svcFormBean};

		//サービスパラメタ設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JKKCommonConst.UCID_KKSV0918);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, JKKCommonConst.OPID_KKSV0918OP);

		// 上りマッピング(サービス項目-DataBean項目マッピング)
		KKSV0918_KKSV0918OPDBMapper mapper = new KKSV0918_KKSV0918OPDBMapper();
		
		// おうちの機器補償登録CC
		inputMap = mapper.setKKSV091801CC(paramBean, inputMap, funcCode);
		
		// サービスの呼び出し
		invokeService(paramMap, inputMap, outputMap);
				
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
	}
	
	/** コード値を元にプルダウンのインデックスを設定します。 */
	private void setPulldownIndex(X31SDataBeanAccess svcFormBean, String pulldownKey, String codeValue) 
	{
		X31SDataBeanAccess pulldownInf = svcFormBean.getDataBeanArray(pulldownKey).getDataBean(0);
		int count = (Integer)pulldownInf.sendMessage(KKW00849SFConst.CD_DIV_LIST_02, X31CWebConst.DATABEAN_GET_COUNT);

		for (int i = 0; i < count; i++)
		{
			String value = pulldownInf.sendMessageString(KKW00849SFConst.CD_DIV_LIST_02, X31CWebConst.DATABEAN_GET_VALUE, i);
			
			if (codeValue.equals(value)) {
				pulldownInf.sendMessageString(KKW00849SFConst.INDEX_02, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(i));
				return;
			}
		}
		
		// ここまで来たら0セット
		pulldownInf.sendMessageString(KKW00849SFConst.INDEX_02, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(0));
	}
	
	/** プルダウンで選択されているコード名称を取得します。 */
	private String getPulldownCdNm(X31SDataBeanAccess svcFormBean, String pulldownKey)
	{
		X31SDataBeanAccess pulldownInf = svcFormBean.getDataBeanArray(pulldownKey).getDataBean(0);
		
		String strIndex = pulldownInf.sendMessageString(KKW00849SFConst.INDEX_02, X31CWebConst.DATABEAN_GET_VALUE);
		if(StringUtils.isEmpty(strIndex)){
			strIndex = "0";
		}
		int index = Integer.parseInt(strIndex);
		
		if((Integer)pulldownInf.sendMessage(KKW00849SFConst.CD_DIV_NM_LIST_02, X31CWebConst.DATABEAN_GET_COUNT) <= index){
			index = 0;
		}
		
		return pulldownInf.sendMessageString(KKW00849SFConst.CD_DIV_NM_LIST_02, X31CWebConst.DATABEAN_GET_VALUE, index);

	}
	
	/** プルダウンで選択されているコード値を取得します。 */
	private String getPulldownCdDiv(X31SDataBeanAccess svcFormBean, String pulldownKey)
	{
		X31SDataBeanAccess pulldownInf = svcFormBean.getDataBeanArray(pulldownKey).getDataBean(0);
		
		String strIndex = pulldownInf.sendMessageString(KKW00849SFConst.INDEX_02, X31CWebConst.DATABEAN_GET_VALUE);
		if(StringUtils.isEmpty(strIndex)){
			strIndex = "0";
		}
		int index = Integer.parseInt(strIndex);
		
		if((Integer)pulldownInf.sendMessage(KKW00849SFConst.CD_DIV_LIST_02, X31CWebConst.DATABEAN_GET_COUNT) <= index){
			index = 0;
		}
		
		return pulldownInf.sendMessageString(KKW00849SFConst.CD_DIV_LIST_02, X31CWebConst.DATABEAN_GET_VALUE, index);

	}
}
