/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：FUW12301SFLogic
*   ソースファイル名：FUW12301SFLogic.java
*   作成者          ：富士通
*   日付            ：2018年09月11日
*＜機能概要＞
*    機器補償サービスオプション申込画面サービスフォームBeanビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者          修正内容
*   v39.00      2018/09/11   FJ）和田(さ)    【ANK-3484-00-00】端末補償サービス導入対応
*   v51.00      2020/10/12   FJ)美濃原       【ANK-3918-00-00】プレクラ施策追加「インターネットサギウォール」「おうちの機器補償」
*   v52.00.00   2021/02/27   FJ) 星野        【ANK-3977-00-00】eoWeb画面の料金表記変更
*   v66.00      2023/01/31   FJ)美濃原       【ANK-4307-00-00】【eo定期】プレミアムクラブリニューアル対応
**********************************************************************/
package eo.web.webview.FUW12301SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.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.JFUCommonRelationCheck;
import eo.web.webview.common.JFUMskmFinMail;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0321_FUSV0321OPDBMapper;
import eo.web.webview.mapping.FUSV0322_FUSV0322OPDBMapper;

/**
 * 機器補償サービスオプション申込画面サービスフォームBeanビューロジック
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW12301SFLogic extends JCCWebBusinessLogic
{

	/** 配列番号[0]:サービスフォームBean */
	private static final int INFO_IDX_SVC_INFO = 0;

	/** サービスユースケースID：機器補償サービスオプション申込(初期表示) */
	private static final String USECASE_ID_FUSV0321 = "FUSV0321";
	/** サービスユースケースID：機器補償サービスオプション申込(申込) */
	private static final String USECASE_ID_FUSV0322 = "FUSV0322";

	/** メッセージID EKF0420-TW */
	private static final String MSG_EKF0420_TW = "EKF0420-TW";
	/** メッセージ置換文字列 EKF0420-TW */
	private static final String[] REP_EKF0420_TW = new String[] { "おうちの機器補償サービス", "選択" };
	/** エラー項目ID kkhs_mskm */
	private static final String ERR_KKHS_MSKM = "kkhs_mskm";

	/** タイプスタンプエラー(アイテム) */
	private static final String UPD_DTM_BF_ITEM = "upd_dtm_bf";


	/** メール機能ID：FUW123_1 */
	private static final String PROCID_FUW123_1 = "FUW123_1";

	/** [料金情報]プロパティファイル取得クエリ */
	private static final String QUERY_DISPCTL_PATH = "DISPSETTING/SETTING[@screenId='FUW12301']/DISPCTL[@groupid='PRC_INFO_TABLE']";

	/** [料金情報]プロパティファイル取得属性名 */
	private static final String QUERY_ATTR_NAME = "id";


	/** 画面表示定義取得キー【料金情報ラベル】月額料金：タイトル */
	private static final String TITLE_LABEL_0 = "TITLE_LABEL_0";

	/** 画面表示定義取得キー【料金情報ラベル】基本料金 */
	private static final String COL_LABEL_0_0 = "COL_LABEL_0_0";

	/** 画面表示定義取得キー【料金情報スタイル】月額料金：タイトル */
	private static final String TITLE_STYLE_0 = "TITLE_STYLE_0";

	/** 画面表示定義取得キー【料金情報スタイル】月額料金：左値・右値 */
	private static final String COL_STYLE_0 = "COL_STYLE_0";

	/** FUDispDefinition取得キー:メール文言取得キー ＰＣプラン */
	private static final String MAIL_MONGON_PC = "MAIL_MONGON_PC";
	/** FUDispDefinition取得キー:メール文言取得キー ＰＣワイドプラン */
	private static final String MAIL_MONGON_PCW = "MAIL_MONGON_PCW";
	/** FUDispDefinition取得キー:メール文言取得キー ＴＶプラン */
	private static final String MAIL_MONGON_TV = "MAIL_MONGON_TV";


	/** 無効の機器提供サービス契約ステータスリスト */
	private static final List<String> MUKOU_KKTK_SVC_KEI_STAT_LIST =
			Arrays.asList(JFUStrConst.CD00056_910, JFUStrConst.CD00056_920);
	/** 無効の機器オプションサービス契約ステータスリスト */
	private static final List<String> MUKOU_KKOP_SVC_KEI_STAT_LIST =
			Arrays.asList(JFUStrConst.CD00056_910, JFUStrConst.CD00056_920);
	
	/** 契約状態：なし */
	private static final String STAT_NON = "0";
	/** 契約状態：PCワイドプラン */
	private static final String STAT_PCW_PLAN = "2";

	/**
	 * 初期処理
	 * <br>
	 * @return	処理結果
	 * @throws Exception	例外
	 */
	public boolean init() throws Exception
	{
		DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込のビューロジック処理(INIT) START★★★★★");

		// ■設備卸チェック
		JFUWebCommon.checkOrosi(this);

		// 初期設定
		JCCWebCommon.getScreenInfo(this);

		// 共有フォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceInfoBean = super.getServiceFormBean();
		// サービスフォームBean.住所変更有無取得
		serviceInfoBean.sendMessageString(FUW12301SFConst.AD_CHG_UM, X31CWebConst.DATABEAN_SET_VALUE, 
				JFUWebCommon.getAdChgUm(this, JFUStrConst.RELATION_CHECK_AD_CHG_CHK_PTN_A));

		// 共有フォームBeanより現顧客契約情報を取得
		Map<String, Object> commonInfoMap = getCommoninfoBeanInfo(commonInfoBean);

		// サービス契約情報を取得
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SVC_KEI_INFO);

		// パラメータ作成
		X31SDataBeanAccess[] paramBean = { serviceInfoBean, commonInfoBean, svcKeiInfoBean };

		
		// ●住所変更中チェック
		checkAddChange(paramBean);
		
		// ●検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// ユースケースID格納用マップを生成
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0321);

		FUSV0321_FUSV0321OPDBMapper mapper = new FUSV0321_FUSV0321OPDBMapper();
		HashMap<String, Object> inputMap = new HashMap<String, Object>();

		// ●上りマッピング
		// 端末補償操作CC
		mapper.setFUSV032101CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		// 割賦契約一覧照会(サービス契約番号)
		mapper.setFUSV032101SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		// 料金プラン固定単価一覧照会（固定料金表示）_PCプラン
		mapper.setFUSV032102SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		// 料金プラン固定単価一覧照会（固定料金表示）_PCワイドプラン
		mapper.setFUSV032103SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		// 料金プラン固定単価一覧照会（固定料金表示）_TVプラン
		mapper.setFUSV032104SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);

		// ●サービスの呼び出し
		try
		{
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●下りマッピング
		// 端末補償操作CC
		mapper.getFUSV032101CC(paramBean, outputMap,JFUWebCommon.getOpeDate(this, null));
		// 割賦契約一覧照会(eoスマートリンク)
		mapper.getFUSV032101SC(paramBean, outputMap);
		// 料金プラン固定単価一覧照会（固定料金表示）_PCプラン
		mapper.getFUSV032102SC(paramBean, outputMap);
		// 料金プラン固定単価一覧照会（固定料金表示）_PCワイドプラン
		mapper.getFUSV032103SC(paramBean, outputMap);
		// 料金プラン固定単価一覧照会（固定料金表示）_TVプラン
		mapper.getFUSV032104SC(paramBean, outputMap);

		
		// ●契約状態エラーの確認
		// ・安心補償オプション契約判定処理（契約中の場合、エラー）
		if (chkAnsinCompsKei(paramBean))
		{
			DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込(12301) 安心補償オプションを１つでも契約中の為、エラー★★★★★");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
		
		// ・ＰＣプラン（ＰＣワイドプランを含む）、ＴＶプランの両方が解約から10ヶ月に満たない場合
		int len = 2;
		X31SDataBeanAccessArray useSvcBeanArray = paramBean[INFO_IDX_SVC_INFO].getDataBeanArray(FUW12301SFConst.COMPS_LIST);

		// PCプランorPCワイドプラン、またはTVプランの解約から10ヶ月か経過結果を取得
		boolean mskmFailPrdPc = false;
		boolean mskmFailPrdTv = false;
		// (以下、[確認する]ボタン押下可・不可チェック用）
		String keiPlanPc = STAT_NON;
		String keiPlanTv = STAT_NON;

		for (int i = 0; i < len; i++)
		{
			X31SDataBeanAccess useSvcDataBean = useSvcBeanArray.getDataBean(i);
			if ( i == 0)
			{
				mskmFailPrdPc 
					= useSvcDataBean.sendMessageBoolean(FUW12301SFConst.MSKM_FAIL_PRD_01, X31CWebConst.DATABEAN_GET_VALUE);
				keiPlanPc
					= useSvcDataBean.sendMessageString(FUW12301SFConst.KEI_PLAN_01, X31CWebConst.DATABEAN_GET_VALUE);
			} else {
				mskmFailPrdTv
					= useSvcDataBean.sendMessageBoolean(FUW12301SFConst.MSKM_FAIL_PRD_01, X31CWebConst.DATABEAN_GET_VALUE);
				keiPlanTv
					= useSvcDataBean.sendMessageString(FUW12301SFConst.KEI_PLAN_01, X31CWebConst.DATABEAN_GET_VALUE);
			}
		}
		
		if (mskmFailPrdPc && mskmFailPrdTv)
		{
			DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込(12301) ＰＣプラン（ＰＣワイドプランを含む）、ＴＶプランの両方が解約から10ヶ月に満たない為、エラー★★★★★");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		// ●[確認する]ボタン表示・非表示
		// PCWのデータがない　かつ　申込不可期間外
		// または
		// TVのデータがない      かつ　申込不可期間外
		// の、場合押下可能
		if (!STAT_PCW_PLAN.equals(keiPlanPc) && !mskmFailPrdPc || STAT_NON.equals(keiPlanTv) && !mskmFailPrdTv)
		{
			paramBean[INFO_IDX_SVC_INFO].sendMessageObject(
					FUW12301SFConst.KC_ADD_KEI_KH_FLG, X31CWebConst.DATABEAN_SET_VALUE, true);
		}
		else
		{
			paramBean[INFO_IDX_SVC_INFO].sendMessageObject(
					FUW12301SFConst.KC_ADD_KEI_KH_FLG, X31CWebConst.DATABEAN_SET_VALUE, false);
		}
		
		// 料金表の表示
		setPrcInfoArea(serviceInfoBean);

		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW12301);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW12301);

		DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込のビューロジック処理(INIT) END★★★★★");
		return true;
	}

	/**
	 * 申込画面の確認ボタン押下時の処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean cfm() throws Exception
	{
		DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込のビューロジック処理(CFM) START★★★★★");

		// 共有フォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceInfoBean = super.getServiceFormBean();

		// 申込情報の入力チェック
		if (!chkMskmInfo())
		{
			return true;
		}

		// パラメータ作成
		X31SDataBeanAccess[] paramBean = { serviceInfoBean, commonInfoBean };

		// ●検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// ユースケースID格納用マップを生成
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0322);

		FUSV0322_FUSV0322OPDBMapper mapper = new FUSV0322_FUSV0322OPDBMapper();
		HashMap<String, Object> inputMap = new HashMap<String, Object>();

		// ●上りマッピング
		mapper.setFUSV032201SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV032201CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV032202CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2,JFUWebCommon.getOpeDate(this, null));
		mapper.setFUSV032202SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV032203CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV032204CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV032205CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);

		// ●サービスの呼び出し
		try
		{
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ■施策リストの画面表示編集処理
		String opeDate = JFUWebCommon.getOpeDate(this, null);

		// ■サービスの結果から画面表示用の施策リストを取得する
		mapper.getPremiumClubList(paramBean, outputMap, JPCModelConstant.FUNC_CD_2, opeDate);

		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW12302);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW12302);

		DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込のビューロジック処理(CFM) END★★★★★");
		return true;
	}

	/**
	 * 申込確認画面の申し込むボタン押下時の処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean mskm() throws Exception
	{
		DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込のビューロジック処理(MSKM) START★★★★★");

		// ●共通関連チェック
		JFUCommonRelationCheck.checkCommonRelation(this, USECASE_ID_FUSV0322);

		// 共有フォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceInfoBean = super.getServiceFormBean();

		// パラメータ作成
		X31SDataBeanAccess[] paramBean = { serviceInfoBean, commonInfoBean };

		// ●検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// ユースケースID格納用マップを生成
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0322);

		FUSV0322_FUSV0322OPDBMapper mapper = new FUSV0322_FUSV0322OPDBMapper();
		HashMap<String, Object> inputMap = new HashMap<String, Object>();

		
		// ●上りマッピング
		mapper.setFUSV032201SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV032201CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV032202CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1,JFUWebCommon.getOpeDate(this, null));
		mapper.setFUSV032202SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV032203CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV032204CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV032205CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);

		// ●サービスの呼び出し
		try
		{
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException jwse)
		{
			chkRelationMskmServiceError(jwse, outputMap);
		}
		
		
		// ●申込完了メールを送信
		// メール可変文字リスト（機器補償サービスオプション）
		String[] textList = { getMskmMailAddMngn(serviceInfoBean) };

		// 申込完了メール送信情報登録
		sendMskmFinMail(PROCID_FUW123_1, null, textList);

		
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW12303);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW12303);

		DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込のビューロジック処理(MSKM) END★★★★★");
		return true;
	}

	/**
	 * 申込確認画面の戻るボタン押下時の処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean back() throws Exception
	{
		DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込のビューロジック処理(BACK) START★★★★★");

		// 共有フォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW12301);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW12301);

		DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込のビューロジック処理(BACK) END★★★★★");
		return true;
	}


	/**
	 * 申込メール追加文言取得
	 * 
	 * @param bean サービスフォームBean
	 * @return メール文言
	 * 
	 * @exception Exception
	 */
	private String getMskmMailAddMngn(X31SDataBeanAccess bean) throws Exception
	{
		StringBuilder mngn = new StringBuilder();

		// １．申し込む（ＰＣプラン）がTRUE
		boolean isMskmPc = bean.sendMessageBoolean(FUW12301SFConst.PC_PLN, X31CWebConst.DATABEAN_GET_VALUE);

		// ２．申し込む（ＰＣワイドプラン) がTRUE
		boolean isMskmPcw = bean.sendMessageBoolean(FUW12301SFConst.PCW_PLN, X31CWebConst.DATABEAN_GET_VALUE);

		// ３．申し込む(ＴＶプラン) がTRUE
		boolean isMskmTv = bean.sendMessageBoolean(FUW12301SFConst.TV_PLN, X31CWebConst.DATABEAN_GET_VALUE);


		if (!isMskmPc && !isMskmPcw && !isMskmTv)
		{
			return JFUStrConst.EMPTY;
		}

		if (isMskmPc)
		{
			mngn.append(JFUWebCommon.getDispText(JFUScreenConst.SCREEN_ID_FUW12302, MAIL_MONGON_PC));
		}

		if (isMskmPcw)
		{
			if (mngn.length() != 0)
			{
				mngn.append(JFUStrConst.RETURN_CODE); // 改行
			}
			mngn.append(JFUWebCommon.getDispText(JFUScreenConst.SCREEN_ID_FUW12302, MAIL_MONGON_PCW));
		}

		if (isMskmTv)
		{
			if (mngn.length() != 0)
			{
				mngn.append(JFUStrConst.RETURN_CODE); // 改行
			}
			mngn.append(JFUWebCommon.getDispText(JFUScreenConst.SCREEN_ID_FUW12302, MAIL_MONGON_TV));
		}
		return mngn.toString();
	}


	/**
	 * 
	 * 申込情報のチェック
	 * 
	 * @return チェック結果
	 */
	private boolean chkMskmInfo()
	{

		boolean isTanKmkChkOk = true;

		// サービスフォームBean
		X31SDataBeanAccess bean = getServiceFormBean();
		
		// [申し込む]選択チェック
		if (!bean.sendMessageBoolean(FUW12301SFConst.PC_PLN, X31CWebConst.DATABEAN_GET_VALUE)
				&& !bean.sendMessageBoolean(FUW12301SFConst.PCW_PLN, X31CWebConst.DATABEAN_GET_VALUE)
				&& !bean.sendMessageBoolean(FUW12301SFConst.TV_PLN, X31CWebConst.DATABEAN_GET_VALUE))
		{
			// エラーメッセージを表示する。
			JCCWebCommon.setMessageInfo(this, MSG_EKF0420_TW, REP_EKF0420_TW, ERR_KKHS_MSKM);
			isTanKmkChkOk = false;
		}

		// 単項目チェックエラーの場合
		if (!isTanKmkChkOk)
		{
			return isTanKmkChkOk;
		}

		return true;
	}

	/**
	 * 料金表情報の設定
	 * <br>
	 * @param bean				サービスフォームBean
	 * @throws Exception		すべての例外
	 */
	private void setPrcInfoArea(X31SDataBeanAccess bean) throws Exception
	{

		// ----------------------------------------------
		// 画面定義情報の取得
		// ----------------------------------------------
		// 料金表プロパティ情報取得
		Map<String, String> dispDefMap = JFUWebCommon.getDispItemsAsMap(QUERY_DISPCTL_PATH, QUERY_ATTR_NAME);

		// ▼金額・単位の取得(カンマ編集込み)
		// 月額料金
		// 「-」
		String kihonPrcNon = JFUStrConst.HALF_HAIHUN;

		StringBuilder dispString = new StringBuilder();		// 税込用

		// PCプラン
		dispString.setLength(0);
		String kihonPrcPc = bean.sendMessageString(FUW12301SFConst.PC_PLAN_PRC, X31CWebConst.DATABEAN_GET_VALUE);
		dispString.append(JFUWebCommon.formatNumber(kihonPrcPc));
		dispString.append(JFUStrConst.YEN);
		String pcPlanPrcIncludeTax = dispString.toString();
		// beanには税込を設定
//		String pcPlanPrcExcludeTax 
//			= JFUWebCommon.getCalcPlanPrcExcludeTax(this,Integer.toString(Integer.parseInt(kihonPrcPc)));
		bean.sendMessageString(FUW12301SFConst.PC_PLAN_PRC, X31CWebConst.DATABEAN_SET_VALUE, pcPlanPrcIncludeTax);
		
		// PCワイドプラン
		dispString.setLength(0);
		String kihonPrcPcw = bean.sendMessageString(FUW12301SFConst.PCW_PLAN_PRC, X31CWebConst.DATABEAN_GET_VALUE);
		kihonPrcPcw = Integer.toString(Integer.parseInt(kihonPrcPc) + Integer.parseInt(kihonPrcPcw));
		dispString.append(JFUWebCommon.formatNumber(kihonPrcPcw));
		dispString.append(JFUStrConst.YEN);
		String pcwPlanPrcIncludeTax = dispString.toString();
		// beanには税込を設定
//		String pcwPlanPrcExcludeTax 
//			= JFUWebCommon.getCalcPlanPrcExcludeTax(this,Integer.toString(Integer.parseInt(kihonPrcPcw)));
		bean.sendMessageString(FUW12301SFConst.PCW_PLAN_PRC, X31CWebConst.DATABEAN_SET_VALUE, pcwPlanPrcIncludeTax);

		// TVプラン
		dispString.setLength(0);
		String kihonPrcTv = bean.sendMessageString(FUW12301SFConst.TV_PLAN_PRC, X31CWebConst.DATABEAN_GET_VALUE);
		dispString.append(JFUWebCommon.formatNumber(kihonPrcTv));
		dispString.append(JFUStrConst.YEN);
		String tvPlanPrcIncludeTax = dispString.toString();
		// beanには税込を設定
//		String tvPlanPrcExcludeTax 
//			= JFUWebCommon.getCalcPlanPrcExcludeTax(this,Integer.toString(Integer.parseInt(kihonPrcTv)));
		bean.sendMessageString(FUW12301SFConst.TV_PLAN_PRC, X31CWebConst.DATABEAN_SET_VALUE, tvPlanPrcIncludeTax);
		
		// PCプラン+TVプラン（税込）※料金シミュレーション用
		dispString.setLength(0);
		String kihonPrcPcTv = "0";
		if (kihonPrcPc != null & kihonPrcTv != null){
			kihonPrcPcTv = (Integer.toString(Integer.parseInt(kihonPrcPc) + Integer.parseInt(kihonPrcTv)));
		}
		dispString.append(JFUWebCommon.formatNumber(kihonPrcPcTv));
		dispString.append(JFUStrConst.YEN);
		String pcTvPlanPrcIncludeTax = dispString.toString();
		
		// PCワイドプラン+TVプラン（税込）※料金シミュレーション用
		dispString.setLength(0);
		String kihonPrcPcwTv = "0";
		if (kihonPrcPcw != null & kihonPrcTv != null){
			kihonPrcPcwTv = (Integer.toString(Integer.parseInt(kihonPrcPcw) + Integer.parseInt(kihonPrcTv)));
		}
		dispString.append(JFUWebCommon.formatNumber(kihonPrcPcwTv));
		dispString.append(JFUStrConst.YEN);
		String pcwTvPlanPrcIncludeTax = dispString.toString();
		

		// テーブルタイトルエリア表示用リスト
		List<String> setTableTitleList = new ArrayList<String>(1);
		setTableTitleList.add(dispDefMap.get(TITLE_LABEL_0)); // 月額料金

		// テーブルスタイルクラス１リスト
		//   →テーブルヘッダのスタイルを指定
		List<String> setTableStyleClass1List = new ArrayList<String>(1);
		setTableStyleClass1List.add(dispDefMap.get(TITLE_STYLE_0)); // 月額料金

		// テーブルスタイルクラス２リスト
		//   →テーブル明細行(左値・右値)のスタイルを指定
		List<String> setTableStyleClass2List = new ArrayList<String>(1);
		setTableStyleClass2List.add(dispDefMap.get(COL_STYLE_0)); // 月額料金

		// ▼月額料金テーブルの設定
		// テーブル左値リスト0 (料金名)
		List<String> setTableLeftValueList0 = new ArrayList<String>(1);
		setTableLeftValueList0.add(dispDefMap.get(COL_LABEL_0_0)); // 基本料金「-」
		setTableLeftValueList0.add(dispDefMap.get(COL_LABEL_0_0)); // 基本料金「PCプラン」
		setTableLeftValueList0.add(dispDefMap.get(COL_LABEL_0_0)); // 基本料金「PCワイドプラン」
		setTableLeftValueList0.add(dispDefMap.get(COL_LABEL_0_0)); // 基本料金「TVプラン」
		setTableLeftValueList0.add(dispDefMap.get(COL_LABEL_0_0)); // 基本料金「PCプランとTVプラン」
		setTableLeftValueList0.add(dispDefMap.get(COL_LABEL_0_0)); // 基本料金「PCワイドプランとTVプラン」

		// テーブル右値リスト0 (料金額)
		List<String> setTableRightValueList0 = new ArrayList<String>(1);
		setTableRightValueList0.add(kihonPrcNon);            // -（選択なし）
		setTableRightValueList0.add(pcPlanPrcIncludeTax);    // PCプラン
		setTableRightValueList0.add(pcwPlanPrcIncludeTax);   // PCワイドプラン
		setTableRightValueList0.add(tvPlanPrcIncludeTax);    // TVプラン
		setTableRightValueList0.add(pcTvPlanPrcIncludeTax);  // PCプランとTVプラン
		setTableRightValueList0.add(pcwTvPlanPrcIncludeTax); // PCワイドプランとTVプラン
		
		// テーブル値識別子エリア表示用リスト0(未使用)
		List<String> setTableValueSkbtList0 = new ArrayList<String>(0);

		// ■テーブルの値、左値、右値の各リストを格納するマップ
		//   ・KEY＝「タイトル名＋タイトル番号(0から始まる連番)＋テーブル左値リスト設定キー」
		//   ・KEY＝「タイトル名＋タイトル番号(0から始まる連番)＋テーブル右値リスト設定キー」
		//   ・KEY＝「タイトル名＋タイトル番号(0から始まる連番)＋テーブル値識別リスト設定キー」
		Map<String, List<String>> tableValueMap = new LinkedHashMap<String, List<String>>(3);

		// ▼月額料金
		tableValueMap.put(dispDefMap.get(TITLE_LABEL_0) + String.valueOf(0) + JFUStrConst.KEY_TABLE_LEFT_VALUE_LIST, setTableLeftValueList0);
		tableValueMap.put(dispDefMap.get(TITLE_LABEL_0) + String.valueOf(0) + JFUStrConst.KEY_TABLE_RIGHT_VALUE_LIST, setTableRightValueList0);
		tableValueMap.put(dispDefMap.get(TITLE_LABEL_0) + String.valueOf(0) + JFUStrConst.KEY_TABLE_VALUE_SKBT_LIST, setTableValueSkbtList0);

		// ----------------------------------------------
		// 料金情報エリアリストBean設定(共通メソッド)
		// ----------------------------------------------
		X31SDataBeanAccessArray prcInfoAreaListArray = bean.getDataBeanArray(JFUStrConst.PRC_INFO_PRC_INFO_AREA_LIST);
		X31SDataBeanAccess titleListArrayAccess = prcInfoAreaListArray.addDataBean();

		// コメントエリア表示用リスト設定(未使用)
		JFUWebCommon.setCommentList(titleListArrayAccess, new ArrayList<String>(0), new ArrayList<String>(0));
		// 備考エリア表示用リスト設定(未使用)
		JFUWebCommon.setBikoList(titleListArrayAccess, new ArrayList<String>(0), new ArrayList<String>(0));
		// テーブルタイトル識別子リスト(未使用)
		List<String> setTableTitleSkbtList = new ArrayList<String>(0);

		// テーブルタイトルエリア表示用リスト設定
		JFUWebCommon.setTableTitleList(titleListArrayAccess, setTableTitleSkbtList, setTableTitleList, setTableStyleClass1List,
				setTableStyleClass2List, tableValueMap);

		// 料金表表示現在日設定処理
		JFUWebCommon.setPrcDspNowDay(this);
	}

	/**
	 * 申込完了メールの送信情報登録を行う。
	 * 例外が発生した場合はスキップする。
	 * <br>
	 * @param procId 機能ID
	 * @param shiteiMlad 指定メールアドレス
	 * @param textList 可変文字リスト
	 */
	private void sendMskmFinMail(String procId, String shiteiMlad, String[] textList)
	{
		try
		{
			JFUMskmFinMail.sendMskmFinMail(this, procId, shiteiMlad, textList, null);
		}
		catch (JCCBusinessException je)
		{
			String sysid =
					JFUWebCommon.getDataBeanItemByPath(getCommonInfoBean(), JFUWebCommon.SSO_INFO + JFUWebCommon.SEP_0 + CommonInfoCFConst.SYSID_21);

			outputBusLog("■ FUW12301 メール送信に失敗しました。 PROC_ID:" + procId + " SYSID: " + sysid);

		}
	}

	/**
	 * ビジネスログへの出力処理
	 *
	 * @param msg ログ情報
	 */
	private void outputBusLog(String msg)
	{
		JSYwebLog.println(JSYLogBase.EXECUTION, getClass(), msg, "CS0003I", null, null);
	}

	
	/**
	 * 住所変更中チェック
	 * <br/>
	 * 住所変更中チェックを行います。
	 *
	 * @param beanArray DataBeanの配列
	 * @throws Exception 
	 */
	private void checkAddChange(X31SDataBeanAccess[] beanArray) throws Exception
	{

		// サービスフォームBean
		X31SDataBeanAccess bean = beanArray[INFO_IDX_SVC_INFO];

		// 住所変更中の場合
		if (JFUStrConst.CD00002_1.equals(bean.sendMessageString(FUW12301SFConst.AD_CHG_UM, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込(FUW12301) 住変中の為、エラー★★★★★");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
		}
	}

	
	/**
	 * 安心補償オプション契約判定
	 * <br/> 
	 * 安心補償オプションを契約しているか判定します。
	 *
	 * @return True:安心補償オプション契約中 False:安心補償オプション未契約
	 * @throws Exception 
	 */
	private boolean chkAnsinCompsKei(X31SDataBeanAccess[] beanArray) throws Exception
	{
		// サービスフォームBean
		X31SDataBeanAccess bean = beanArray[INFO_IDX_SVC_INFO];
		
		// サービスフォームBean.割賦契約一覧照会(eoスマートリンク)明細
		X31SDataBeanAccessArray kapKei = bean.getDataBeanArray(FUW12301SFConst.KK_T_KAP_KEI);
		
		for (int i = 0; i < kapKei.getCount(); i++)
		{
			// 読み飛ばし判定(割賦契約ステータス)
			if (!getKapKeiUmuBySta(kapKei.getDataBean(i)))
			{
				continue;
			}

			// 読み飛ばし判定(機器提供サービス契約ステータス)
			if (!chkKikiBySta(kapKei.getDataBean(i)))
			{
				continue;
			}
			
			// 端末補償に入っている場合(解約、キャンセルはFalseで返却される)
			if (chkCompsUmu(kapKei.getDataBean(i)))
			{
				return true;
			}
		}
		return false;
	}

	
	/**
	 * 割賦契約有無フラグ設定
	 * <br/> 
	 * 割賦契約有無の状態を割賦契約ステータスにより判定してフラグで返却します。
	 *
	 * @param bean サービスフォームBean
	 * @return true:割賦契約有 / false:割賦契約無
	 */
	private boolean getKapKeiUmuBySta(X31SDataBeanAccess bean)
	{
		// 割賦契約 ステータスチェック
		String kapStat = bean.sendMessageString(FUW12301SFConst.KAP_KEI_STAT_02, X31CWebConst.DATABEAN_GET_VALUE);

		if (JFUStrConst.CD01471_910.equals(kapStat) || JFUStrConst.CD01471_920.equals(kapStat) )
		{
			return false;
		}

		return true;
	}


	/**
	 * 機器提供サービス契約対象判定
	 * <br/> 
	 * 機器提供サービス契約のステータスにて処理対象有無を判定します。
	 *
	 * @param bean サービスフォームBean
	 * @return true:処理対象 / false:処理対象外
	 */
	private boolean chkKikiBySta(X31SDataBeanAccess bean)
	{
		// 機器提供サービス契約 ステータスチェック
		String kikiStat = bean.sendMessageString(FUW12301SFConst.KKTK_SVC_KEI_STAT_02, X31CWebConst.DATABEAN_GET_VALUE);

		// ○ステータス判定
		if (MUKOU_KKTK_SVC_KEI_STAT_LIST.contains(kikiStat))
		{
			return false;
		}
		
		return true;
	}

	
	/**
	 * 端末補償有無チェック
	 * <br/> 
	 * 端末補償有の場合、Trueを返却します。
	 *
	 * @param kapKei 保有している端末情報
	 * @return True:端末補償あり False:端末補償なし
	 */
	private boolean chkCompsUmu(X31SDataBeanAccess kapKei) 
	{
		String kkopSvcKeiNo = kapKei.sendMessageString(FUW12301SFConst.KKOP_SVC_KEI_NO_02, X31CWebConst.DATABEAN_GET_VALUE);
		// 端末補償に入っていない場合
		if (JFUWebCommon.isNull(kkopSvcKeiNo))
		{
			// 端末補償なし
			return false;
		}
		
		// 機器オプションサービス契約 ステータスチェック
		String kkopStat = kapKei.sendMessageString(FUW12301SFConst.KKOP_SVC_KEI_STAT_02, X31CWebConst.DATABEAN_GET_VALUE);

		// ○無効ステータス判定
		if (MUKOU_KKOP_SVC_KEI_STAT_LIST.contains(kkopStat))
		{
			// 端末補償なし
			return false;
		}

		// 端末補償あり
		return true;
	}
	

	/**
	 * データBeanリストから0番目のデータBeanを取得
	 * <br/>
	 * データBeanリストから0番目のデータBeanを取得します。
	 * 
	 * @param bean サービスフォームBean
	 * @param componentID componentID
	 * @return 取得したデータBean
	 */
	private X31SDataBeanAccess getX31SDataBeanAccess(X31SDataBeanAccess bean, String componentID)
	{
		X31SDataBeanAccessArray subBeanArray = bean.getDataBeanArray(componentID);
		X31SDataBeanAccess subBean = subBeanArray.getDataBean(0);
		if (null == subBean)
		{
			subBeanArray.addDataBean();
			subBean = subBeanArray.getDataBean(0);
		}
		return subBean;
	}

	
	/**
	 * 共有フォームBean情報取得
	 * <br/> 
	 * 共有フォームBeanの情報を取得します。
	 * 
	 * @param commoninfoBean 共有フォームBean
	 * @return 取得した情報を保持したマップ
	 */
	private Map<String, Object> getCommoninfoBeanInfo(X31SDataBeanAccess commoninfoBean)
	{
		// 結果マップ
		Map<String, Object> resultMap = new HashMap<String, Object>();

		// ★WEB変更情報
		X31SDataBeanAccess webChgInfoBean = getX31SDataBeanAccess(commoninfoBean, CommonInfoCFConst.WEB_CHG_INFO);

		// ★SSO情報(WEB変更情報の子階層)
		X31SDataBeanAccessArray ssoInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.SSO_INFO);
		X31SDataBeanAccess ssoInfoBean = ssoInfoArray.getDataBean(0);

		// ★現顧客情報(WEB変更情報の子階層)
		X31SDataBeanAccessArray genCustKeiInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO);
		X31SDataBeanAccess genCustKeiInfoBean = genCustKeiInfoArray.getDataBean(0);

		// ★サービス契約情報
		X31SDataBeanAccessArray svcKeiInfoArray = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess svcKeiInfoBean = svcKeiInfoArray.getDataBean(0);

		// 各Bean情報を設定
		resultMap.put(CommonInfoCFConst.SSO_INFO, ssoInfoBean);
		resultMap.put(CommonInfoCFConst.SVC_KEI_INFO, svcKeiInfoBean);
		resultMap.put(CommonInfoCFConst.GEN_CUST_KEI_INFO, genCustKeiInfoBean);

		return resultMap;
	}

	
	/**
	 * サービス処理結果例外判定(申込処理)
	 * <br/>
	 * サービス処理結果の例外判定をします。
	 * 
	 * @param jwse 例外
	 */
	private void chkRelationMskmServiceError(JCCWebServiceException jwse, HashMap<String, Object> outputMap)
	{
		X31CMessageResult msgRes = jwse.getMessageList();

		for (X31CMessageMoreInfo moreInfo : Arrays.asList(msgRes.getMessageMoreInfoList()))
		{

			if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(moreInfo.getStatus()) 
					&& UPD_DTM_BF_ITEM.equals(moreInfo.getItemId()) 
					&& JFUStrConst.RELATION_CHECK_ERR_EA.equals(moreInfo.getItemCheckErr()))
			{
				DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込(FUW12301) FUSV0322 申込サービスシステムエラー(タイムスタンプ)★★★★★");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0204);
			}
			else
			{
				DEBUG_LOG.debug("★★★★★機器補償サービスオプション申込(FUW12301) FUSV0322 申込サービスシステムエラー(その他)★★★★★");
				// システムエラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
			}
		}
	}

}