/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：FUW02301SFLogic
 *   ソースファイル名：FUW02301SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2011年05月31日
 *＜機能概要＞
 *   メールアドレス変更申込のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/05/31   FJ）谷本    新規作成
 *   v3.00.00    2012/03/27   FJ) 谷本    変更【ANK-0041-00-00】 申込完了メール対応
 *   v4.00       2012/07/10   FJ) 井口    変更【ANK-1163-00-00】 変更系申込が可能となるタイミングについて
 *   v4.00       2012/08/22   FJ) 井口    変更【ANK-0545-00-00】 PMP：サービスコード対応（指示書登録）
 *   v4.00       2012/09/25   FJ) 岡井    変更【ANK-1198-00-00】変更系申込画面の提供条件・利用規約の設置位置について
 *   v4.00       2012/10/27   FJ）大島    変更【ANK-1255-00-00】オプション解約に伴う課金制御
 *   v5.00       2013/03/07   FJ）谷本    変更【ST1-2013-0000437】フロント「オプトインメール受信設定」設定漏れ対応
 *   v5.00       2013/03/21   FJ）中谷    変更【IT1-2013-0000571】一時支払料金の取得項目変更(申込完了メールの送信先の改修)
 *   v6.00       2013/12/03   FJ）中谷    変更【OM-2013-0004592】メールアドレス変更時SOD発行の改修
 *   v8.00       2014/01/27   FJ) 文元    変更【ANK-1589-00-00】消費増税に伴う料金施策
 *   v7.00       2014/03/18   FJ）西川    変更【OM-2014-0001125】メールアドレスeo間引継ぎの改修
 *   v14.0.0     2015/04/23   FJ）谷本    変更【ANK-2414-00-00】メールアドレス変更禁止の期間短縮
 *   v37.00      2018/02/16   FJ) 美濃原  変更【ANK-3366-00-00】eo光設備卸対応
 *
 **********************************************************************/
package eo.web.webview.FUW02301SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.math.BigDecimal;
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.X31SWebLog;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JPCUtilCommon;
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.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0064_FUSV0064OPDBMapper;
import eo.web.webview.mapping.FUSV0065_FUSV0065OPDBMapper;

/**
 * メールアドレス変更申込のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings({"serial", "unchecked"})
public class FUW02301SFLogic extends JCCWebBusinessLogic
{

	/** 申込完了メール 申込 */
	private static final String MSKM_FIN_MAIL_FUW023_1 = "FUW023_1";

	/** サービスID：メールアドレス変更申込(新規表示) */
	private static final String USECASE_ID_FUSV0064 = "FUSV0064";
	/** サービスID：メールアドレス変更申込(申込) */
	private static final String USECASE_ID_FUSV0065 = "FUSV0065";

	/** 初期費用一覧照会CC */
	private static final String CC_TITLE_FUSV006401 = "FUSV006401CC";

	/** 初期費用一覧照会明細 */
	private static final String EKK0721A010_LIST = "EKK0721A010CBSMsg1List";

	/** 会員情報更新依頼CC */
	private static final String CC_TITLE_CKSV9001 = "CKSV9001";

	/** エラー判定用テンプレート：EKK0361C050_オプションサービス契約＜ISP＞情報変更 */
	private static final String EKK0361C050 = "EKK0361C050";
	/** エラー判定用アイテム：希望メールアカウント1 */
	private static final String KIBO_ML_ACCOUNT_1 = "kibo_ml_account_1";
	/** エラー判定用アイテム：メールアドレス */
	private static final String MLAD = "mlad";
	/** エラー判定用アイテム：更新年月日時分秒(更新前) */
	private static final String UPD_DTM_BF = "upd_dtm_bf";

	/** 同日を含む／含まないの指定(0：含まない、1：含む) */
	private static final String METHOD_FLG_ISFUTUREDATE_0 = "0";

	/** メソッド：確認ボタン押下時 */
	private static final String CALL_METHOD_CFM = "cfm";
	/** メソッド：申込ボタン押下時 */
	private static final String CALL_METHOD_MSKM = "mskm";
	
	/** ギガバイト */
	private static final String GIGA_BYTE = "GB";
	/** メガバイト */
	private static final String MEGA_BYTE = "MB";
	/** 契約中 */
	private static final String KEIYAKU_CHYU = "契約中";
	
	/** ご利用なし */
	private static final String GORIYOU_NASHI = "ご利用なし";
	
	/** 引き継がない */
	private static final String HIKITUGANAI = "引き継がない";
	
	/** かんたん迷惑メール拒否設定、かんたんメール転送設定、フィルター設定、迷惑メールチェックサービス 引き継ぐ*/
	private static final String MWKML_SETTE_HIKITUGU = "eoWEBメールで設定されていた場合は引き継ぐ";
	
	/** かんたん迷惑メール拒否設定、かんたんメール転送設定、フィルター設定、迷惑メールチェックサービス 引き継がない */
	private static final String MWKML_SETTE_HIKITUGANAI = "eoWEBメールで設定されていても引き継がない";
	
	/** 転送する */
	private static final String TENSOU_SURU = "転送する";
	
	/** 転送しない */
	private static final String TENSOU_SHINAI = "転送しない";
	
	/**メールパスワード文言 */
	private static final String ML_PWD_MONGON = "変更前のお申し込み内容を引き継ぐ";
	
	/** 1024MB */
	private static final BigDecimal BIGDECMAL1024 = new BigDecimal(1024);

	/** メールアドレス変更期間チェック有効回数 */
	private static final int MLAD_CHG_CHK_YUKO_CNT = 3;

	/**
	 * 初期処理
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{

		// ■設備卸チェック
		JFUWebCommon.checkOrosi(this);

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより現顧客契約情報を取得する。
		Map<String, Object> resultMap = getCommoninfoBeanInfo(commoninfoBean);
		// SSO情報
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SSO_INFO);
		// サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SVC_KEI_INFO);
		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);
		// サブオプションサービス契約情報
		X31SDataBeanAccess sbopSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SBOP_SVC_KEI_INFO);

		// ---- 入力チェック ----
		checkSvcData(resultMap);

		// ---- サービスフォームbean ----
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// ●サービス呼び出し処理
		// メールアドレス変更申込（初期表示）サービスの呼び出しを行う。
		X31SDataBeanAccess[] paramBean = { bean, ssoInfoBean, svcKeiInfoBean, opSvcKeiInfoBean, sbopSvcKeiInfoBean };

		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0064);

		FUSV0064_FUSV0064OPDBMapper mapper = new FUSV0064_FUSV0064OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// SC
		// 1.業務パラメータ管理一意照会SC - 契約変更不能日数
		dataMap = mapper.setFUSV006401SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 2.業務パラメータ管理一意照会SC - 変更前メールアドレス送受信可能期間
		dataMap = mapper.setFUSV006402SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 3.業務パラメータ管理一意照会SC - POPサーバー名
		dataMap = mapper.setFUSV006403SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 4.業務パラメータ管理一意照会SC - SMTPサーバー名
		dataMap = mapper.setFUSV006404SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 5.NGワード一覧照会(フロント)SC
		dataMap = mapper.setFUSV006405SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// CC
		// 1.初期費用一覧照会CC
		dataMap = mapper.setFUSV006401CC(paramBean, dataMap);
		// 2.メールアドレス変更回数取得CC
		dataMap = mapper.setFUSV006402CC(paramBean, dataMap);

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		try
		{
			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●サービス処理結果の取得
		// SC
		// 1.業務パラメータ管理一意照会SC - 契約変更不能日数
		bean = mapper.getFUSV006401SC(bean, outputMap);
		// 2.業務パラメータ管理一意照会SC - 変更前メールアドレス送受信可能期間
		bean = mapper.getFUSV006402SC(bean, outputMap);
		// 3.業務パラメータ管理一意照会SC - POPサーバー名
		bean = mapper.getFUSV006403SC(bean, outputMap);
		// 4.業務パラメータ管理一意照会SC - SMTPサーバー名
		bean = mapper.getFUSV006404SC(bean, outputMap);
		// 5.NGワード一覧照会(フロント)SC
		bean = mapper.getFUSV006405SC(bean, outputMap);
		// CC
		// 2.メールアドレス変更回数取得CC
		bean = mapper.getFUSV006402CC(bean, outputMap);

		// ●料金表マッピング
		JFUWebCommon.setPrcInfoArea(bean, outputMap, null, CC_TITLE_FUSV006401, JFUScreenConst.SCREEN_ID_FUW02301);

		// ●後チェック
		// メールアドレス変更不可期間チェック
		// 共有フォームBean.オプションサービス契約情報.メールアドレス変更年月日から、FUW02301SF.変更不可期間日数を経過していない場合
		String mladChgeYmd = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.MLAD_CHGE_YMD_28, X31CWebConst.DATABEAN_GET_VALUE);
		int keiChgStpPrd = Integer.parseInt(bean.sendMessageString(FUW02301SFConst.KEI_CHG_STP_PRD, X31CWebConst.DATABEAN_GET_VALUE));
		int mladChgCnt = Integer.parseInt(bean.sendMessageString(FUW02301SFConst.MLAD_CHG_CNT, X31CWebConst.DATABEAN_GET_VALUE));
		// メールアドレス変更回数≧3回以上の場合変更期間のチェックを行う。
		if (mladChgCnt >= MLAD_CHG_CHK_YUKO_CNT)
		{
			// メールアドレス変更年月日がNULL以外 且つ メールアドレス変更年月日＋変更不可期間日数＞システム日の場合エラー
			if (JFUWebCommon.isNull(mladChgeYmd) == false
					&& JPCUtilCommon.isFutureDate(JPCUtilCommon.addDay(mladChgeYmd, keiChgStpPrd), JCCWebCommon.getOpeDate(this, null),
							METHOD_FLG_ISFUTUREDATE_0))
			{
				// 契約状態エラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
		}
		
		// 無料フラグ
		bean.sendMessageBoolean(FUW02301SFConst.FREE_FLG, X31CWebConst.DATABEAN_SET_VALUE, setFreeFlg(bean, outputMap));
		// マンション区分
		bean.sendMessageBoolean(FUW02301SFConst.MANSION_DIV, X31CWebConst.DATABEAN_SET_VALUE, getMansionDiv(commoninfoBean, outputMap));
		// 現在のPOPID
		bean.sendMessageString(FUW02301SFConst.NOW_POP_ID, X31CWebConst.DATABEAN_SET_VALUE, opSvcKeiInfoBean.sendMessageString(
				CommonInfoCFConst.POP_ID_28, X31CWebConst.DATABEAN_GET_VALUE));
		// 現在のメールアドレス
		String mlAd = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.MLAD_28, X31CWebConst.DATABEAN_GET_VALUE);
		// 現在のメールアドレス
		bean.sendMessageString(FUW02301SFConst.NOW_MLAD, X31CWebConst.DATABEAN_SET_VALUE, mlAd);
		// サブドメイン
		bean.sendMessageString(FUW02301SFConst.SUB_DOMAIN, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.ATMARK + mlAd.split(JFUStrConst.ATMARK)[1]);
		// 同意
		bean.sendMessageBoolean(FUW02301SFConst.KEIYAKU_YAKKAN_DOI, X31CWebConst.DATABEAN_SET_VALUE, false);

		// 料金表表示現在日設定処理
		JFUWebCommon.setPrcDspNowDay(this);
		
		// -------- 遷移先画面の指定 --------
		// 遷移先画面IDを設定（画面機能の先頭になる場合の固定ロジック）
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon.getScreenId(this));
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02301);

		return true;
	}

	/**v
	 * 申込画面の確認ボタン押下
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean cfm() throws Exception
	{

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより現顧客契約情報を取得する。
		Map<String, Object> resultMap = getCommoninfoBeanInfo(commoninfoBean);
		// SSO情報
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SSO_INFO);
		// サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SVC_KEI_INFO);
		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);
		// サブオプションサービス契約情報
		X31SDataBeanAccess sbopSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SBOP_SVC_KEI_INFO);

		// ---- サービスフォームbean ----
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		// 表示用設定
		getDispInfo(commoninfoBean, bean);

		// ●サービス呼び出し処理
		// メールアドレス変更申込(新規表示)申込（申込み）サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0065);

		FUSV0065_FUSV0065OPDBMapper mapper = new FUSV0065_FUSV0065OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = { bean, ssoInfoBean, svcKeiInfoBean, opSvcKeiInfoBean, sbopSvcKeiInfoBean };

		// SC
		// 1.申込内容承認登録
		dataMap = mapper.setFUSV006501SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 2.サブオプションサービス契約解約
		dataMap = mapper.setFUSV006502SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 11.サブオプションサービス契約解約確定
		dataMap = mapper.setFUSV006511SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 12.サブオプションサービス契約キャンセル
		dataMap = mapper.setFUSV006512SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 3.オプションサービス契約<ISP>情報変更
		dataMap = mapper.setFUSV006503SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 4.エイジング対象使用終了
		dataMap = mapper.setFUSV006504SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 5.エイジング対象使用終了
		dataMap = mapper.setFUSV006505SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 6.エイジング対象使用終了
		dataMap = mapper.setFUSV006506SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 7.エイジング対象登録
		dataMap = mapper.setFUSV006507SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 8.エイジング対象登録
		dataMap = mapper.setFUSV006508SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 9.進捗登録
		dataMap = mapper.setFUSV006509SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 10.申込明細照査・後続業務依頼
		dataMap = mapper.setFUSV006510SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 13.オプションサービス契約一意照会SC
		dataMap = mapper.setFUSV006513SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 14.オプションサービス契約＜ISP＞一意照会SC
		dataMap = mapper.setFUSV006514SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 15.指示書登録SC
		dataMap = mapper.setFUSV006515SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);

		// CC
		// 1.オプションサービス契約<ISP>一意照会CC
		dataMap = mapper.setFUSV006501CC(paramBean, dataMap);
		// 2.サービスIF結果データ移送
		dataMap = mapper.setFUSV006502CC(paramBean, dataMap);
		// 3.エイジング一覧照会(エイジング対象値)CC
		dataMap = mapper.setFUSV006503CC(paramBean, dataMap);
		// 4.エイジング一覧照会(エイジング対象値)CC
		dataMap = mapper.setFUSV006504CC(paramBean, dataMap);
		// 5.エイジング一覧照会(エイジング対象値)CC
		dataMap = mapper.setFUSV006505CC(paramBean, dataMap);
		// 6.メールアドレスSODマッピングCC
		dataMap = mapper.setFUSV006506CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 7.サービスオーダ発行CC
		dataMap = mapper.setFUSV006507CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 8.非課金判定CC
		dataMap = mapper.setFUSV006508CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 9.オプトインメール受信設定登録CC
		dataMap = mapper.setFUSV006509CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// メールエイリアス契約保有時、サブオプションサービス契約ステータスを予備1に設定
		if (!JFUWebCommon.isNull(resultMap.get(CommonInfoCFConst.SBOP_SVC_KEI_INFO)))
		{
			JFUWebCommon.setSbopSvcKeiStatRsv1(this, dataMap, JFUStrConst.CD00136_B001, JFUStrConst.CD00137_D01);
		}

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();
		try
		{

			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);

		}
		catch (JCCWebServiceException se)
		{
			checkException(se, CALL_METHOD_CFM);
		}

		// -------- 遷移先画面の指定 --------
		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW02302);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02302);

		return true;
	}

	/**
	 * 確認画面の申し込むボタン押下
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean mskm() throws Exception
	{

		// ●共通関連チェックの呼び出し処理
		JFUCommonRelationCheck.checkCommonRelation(this, USECASE_ID_FUSV0065);

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより現顧客契約情報を取得する。
		Map<String, Object> resultMap = getCommoninfoBeanInfo(commoninfoBean);
		// SSO情報
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SSO_INFO);
		// サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SVC_KEI_INFO);
		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);
		// サブオプションサービス契約情報
		X31SDataBeanAccess sbopSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SBOP_SVC_KEI_INFO);
		//現顧客契約情報
		X31SDataBeanAccess genCustKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.GEN_CUST_KEI_INFO);

		// 会員種別コード ← 共有フォームBean.
		String menberSbtCd = genCustKeiInfoBean.sendMessageString(CommonInfoCFConst.MEMBER_SBT_CD_22, X31CWebConst.DATABEAN_GET_VALUE);

		String optinFuncCd = JPCModelConstant.FUNC_CD_2;

		if (JFUStrConst.CD00039_11.equals(menberSbtCd) || JFUStrConst.CD00039_21.equals(menberSbtCd))
		{
			optinFuncCd = JPCModelConstant.FUNC_CD_4;
		}

		// 変更前メールアドレス
		String chgBfMlad = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.MLAD_28, X31CWebConst.DATABEAN_GET_VALUE);
		// ---- サービスフォームbean ----
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		// 表示用設定
		getDispInfo(commoninfoBean, bean);

		// ●サービス呼び出し処理
		// メールアドレス変更申込(新規表示)申込（申込み）サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0065);

		FUSV0065_FUSV0065OPDBMapper mapper = new FUSV0065_FUSV0065OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = { bean, ssoInfoBean, svcKeiInfoBean, opSvcKeiInfoBean, sbopSvcKeiInfoBean };

		// SC
		// 1.申込内容承認登録
		dataMap = mapper.setFUSV006501SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 2.サブオプションサービス契約解約
		dataMap = mapper.setFUSV006502SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 11.サブオプションサービス契約解約確定
		dataMap = mapper.setFUSV006511SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 12.サブオプションサービス契約キャンセル
		dataMap = mapper.setFUSV006512SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 3.オプションサービス契約<ISP>情報変更
		dataMap = mapper.setFUSV006503SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 4.エイジング対象使用終了
		dataMap = mapper.setFUSV006504SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 5.エイジング対象使用終了
		dataMap = mapper.setFUSV006505SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 6.エイジング対象使用終了
		dataMap = mapper.setFUSV006506SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 7.エイジング対象登録
		dataMap = mapper.setFUSV006507SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 8.エイジング対象登録
		dataMap = mapper.setFUSV006508SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 9.進捗登録
		dataMap = mapper.setFUSV006509SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 10.申込明細照査・後続業務依頼
		dataMap = mapper.setFUSV006510SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 13.オプションサービス契約一意照会SC
		dataMap = mapper.setFUSV006513SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 14.オプションサービス契約＜ISP＞一意照会SC
		dataMap = mapper.setFUSV006514SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 15.指示書登録SC
		dataMap = mapper.setFUSV006515SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// CC
		// 1.オプションサービス契約<ISP>一意照会CC
		dataMap = mapper.setFUSV006501CC(paramBean, dataMap);
		// 2.サービスIF結果データ移送
		dataMap = mapper.setFUSV006502CC(paramBean, dataMap);
		// 3.エイジング一覧照会(エイジング対象値)CC
		dataMap = mapper.setFUSV006503CC(paramBean, dataMap);
		// 4.エイジング一覧照会(エイジング対象値)CC
		dataMap = mapper.setFUSV006504CC(paramBean, dataMap);
		// 5.エイジング一覧照会(エイジング対象値)CC
		dataMap = mapper.setFUSV006505CC(paramBean, dataMap);
		// 6.メールアドレスSODマッピングCC
		dataMap = mapper.setFUSV006506CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 7.サービスオーダ発行CC
		dataMap = mapper.setFUSV006507CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 8.非課金判定CC
		dataMap = mapper.setFUSV006508CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 9.オプトインメール受信設定登録CC
		dataMap = mapper.setFUSV006509CC(paramBean, dataMap, optinFuncCd);

		// メールエイリアス契約保有時、サブオプションサービス契約ステータスを予備1に設定
		if (!JFUWebCommon.isNull(resultMap.get(CommonInfoCFConst.SBOP_SVC_KEI_INFO)))
		{
			JFUWebCommon.setSbopSvcKeiStatRsv1(this, dataMap, JFUStrConst.CD00136_B001, JFUStrConst.CD00137_D01);
		}

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();
		try
		{
			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);

		}
		catch (JCCWebServiceException se)
		{
			checkException(se, CALL_METHOD_MSKM);
		}

		// CKSV9001のサービス情報を設定
		Map<String, String> ckParamMap = new HashMap<String, String>();
		ckParamMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, CC_TITLE_CKSV9001);

		HashMap<String, Map<String, String>> ckInputMap = new HashMap<String, Map<String, String>>();
		HashMap<String, String> ckOutputMap = new HashMap<String, String>();

		// ●上りマッピング
		// 会員情報更新依頼
		mapper.setCKSV900101CC(paramBean, ckInputMap);

		try
		{
			// ●サービス呼出
			invokeService(ckParamMap, ckInputMap, ckOutputMap);
		}
		catch (Throwable ta)
		{
			// エラーでも何もしない
			DEBUG_LOG.debug("CKSV9001：会員情報更新依頼でエラーが発生したが処理は続行する");
		}

		// ●現顧客リフレッシュ処理
		// POPID（検索条件なのでセットしています）
		JFUWebCommon.setDataBeanItemByPath(commoninfoBean, JFUWebCommon.SSO_INFO + JFUWebCommon.SEP_0 + CommonInfoCFConst.POP_ID_21, (bean
				.sendMessageString(FUW02301SFConst.CHG_MLAD, X31CWebConst.DATABEAN_GET_VALUE) + bean.sendMessageString(FUW02301SFConst.SUB_DOMAIN,
				X31CWebConst.DATABEAN_GET_VALUE)).replace(JFUStrConst.ATMARK, JFUStrConst.PERCENT));
		JFUWebCommon.refreshGenCustKei(this);

		// ●共有フォームBeanより現顧客契約情報を取得する。
		resultMap = getCommoninfoBeanInfo(commoninfoBean);

		// オプションサービス契約情報
		opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);

		// ●Beanにセット
		// POPパスワード ← 共有フォームBean.ＳＳＯ情報.ＰＯＰＩＤパスワード
		bean.sendMessageString(FUW02301SFConst.POP_PWD, X31CWebConst.DATABEAN_SET_VALUE, opSvcKeiInfoBean.sendMessageString(
				CommonInfoCFConst.SHK_POP_ID_PWD_28, X31CWebConst.DATABEAN_GET_VALUE));
		// 確定メールアドレス ← 共有フォームBean.
		bean.sendMessageString(FUW02301SFConst.FIX_MLAD, X31CWebConst.DATABEAN_SET_VALUE, opSvcKeiInfoBean.sendMessageString(
				CommonInfoCFConst.MLAD_28, X31CWebConst.DATABEAN_GET_VALUE));
//		// メールボックス容量 ← 共有フォームBean.
//		bean.sendMessageString(FUW02301SFConst.MLBOX_CAPA, X31CWebConst.DATABEAN_SET_VALUE, opSvcKeiInfoBean.sendMessageString(
//				CommonInfoCFConst.CAPA_28, X31CWebConst.DATABEAN_GET_VALUE));

		// 除外オプションサービス契約番号
		String ignoreOpSvcKeiNo = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_28, X31CWebConst.DATABEAN_GET_VALUE);

		// 申込完了メール送信部品呼出処理
		JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW023_1, chgBfMlad, null, ignoreOpSvcKeiNo);

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW02303);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02303);

		return true;
	}

	/**
	 * 確認画面の戻るボタン押下
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean back() throws Exception
	{

		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW02301);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02301);

		return true;
	}
	
	/**
	 * 表示用設定 <BR>
	 * 
	 * @param commoninfoBean
	 * @param bean
	 * @return 取得した情報を保持したマップ
	 */
	private X31SDataBeanAccess getDispInfo(X31SDataBeanAccess commoninfoBean, X31SDataBeanAccess bean)
	{
		// ○WEB変更情報
		X31SDataBeanAccess webChgInfoBean = commoninfoBean.getDataBeanArray(CommonInfoCFConst.WEB_CHG_INFO).getDataBean(0);
		// ○SSO情報
		X31SDataBeanAccess ssoInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.SSO_INFO).getDataBean(0);

		// SSO情報取得
		String ssoInfoPopid = ssoInfoBean.sendMessageString(CommonInfoCFConst.POP_ID_21, X31CWebConst.DATABEAN_GET_VALUE);

		// ○現顧客情報
		X31SDataBeanAccess genCustKeiInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO).getDataBean(0);
		// ○サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO).getDataBean(0);
		// ○サービス契約内訳情報
		X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO).getDataBean(0);

		// ○オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = null;
		
		// オプションサービス契約情報（配列）
		X31SDataBeanAccessArray opSvcKeiInfoArray = svcKeiUcwkInfoBean.getDataBeanArray(CommonInfoCFConst.OP_SVC_KEI_INFO);
		
		for (int m = 0; m < opSvcKeiInfoArray.getCount(); m++)
		{
			// オプションサービス契約情報（作業用）
			X31SDataBeanAccess tmpOpSvcKeiInfoBean = opSvcKeiInfoArray.getDataBean(m);
			// POPID
			String popId = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.POP_ID_28, X31CWebConst.DATABEAN_GET_VALUE);

			// オプションサービスコード
			String opSvCd = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_CD_28, X31CWebConst.DATABEAN_GET_VALUE);

			// POPID = SSO情報.POPID 且つ 「B001:Eメール」の場合
			if (ssoInfoPopid.equals(popId) && JFUStrConst.CD00136_B001.equals(opSvCd))
			{
				// オプションサービス契約情報（確定）
				opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;
				
				///////////////////////////////////////////////
				///////////  メールボックス容量 ///////////////
				///////////////////////////////////////////////
				String capa = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.CAPA_28, X31CWebConst.DATABEAN_GET_VALUE);
				
				int capaInt = Integer.parseInt(capa);
				
				// 1024MB以上の場合
				if (1024 <= capaInt)
				{
					BigDecimal capaDecimal = new BigDecimal(capa).divide(BIGDECMAL1024);
					capaDecimal = capaDecimal.setScale(1, BigDecimal.ROUND_UP);
					bean.sendMessageString(FUW02301SFConst.MLBOX_CAPA, X31CWebConst.DATABEAN_SET_VALUE, capaDecimal + GIGA_BYTE);
				}
				// 1024MB未満の場合
				else
				{
					bean.sendMessageString(FUW02301SFConst.MLBOX_CAPA, X31CWebConst.DATABEAN_SET_VALUE, capa + MEGA_BYTE);
				}
			}
		}
		
		// メールウィルスチェックフラグ
		boolean mlViruschkFlg = false;
		// メールエイリアス
		String mlAlias = null;
		// メールエイリアスフラグ
		boolean mlAliasFlg = false;
		// 申し込む（設定引き継ぎ）
		boolean mskmSetteHktgFlg = bean.sendMessageBoolean(FUW02301SFConst.MSKM_SETTE_HKTG, X31CWebConst.DATABEAN_GET_VALUE);
		// 申し込む（旧メール転送）
		boolean mskmOldMailTenso = bean.sendMessageBoolean(FUW02301SFConst.MSKM_OLD_MAIL_TENSO, X31CWebConst.DATABEAN_GET_VALUE);
		
		if (opSvcKeiInfoBean != null)
		{
			// オプションサービス契約情報のオプションサービス番号
			String opInfoOpSvcKeiNo = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_28, X31CWebConst.DATABEAN_GET_VALUE);
			
			// サブオプションサービス契約情報（配列）⇒オプションサービス契約情報の配列の１番目から取得
			X31SDataBeanAccessArray sbopSvcKeiInfoArray = opSvcKeiInfoArray.getDataBean(0).getDataBeanArray(CommonInfoCFConst.SBOP_SVC_KEI_INFO);
			
			for (int n = 0; n < sbopSvcKeiInfoArray.getCount(); n++)
			{
				// サブオプションサービス契約情報（作業用）
				X31SDataBeanAccess tmpSbopSvcKeiInfoBean = sbopSvcKeiInfoArray.getDataBean(n);
				// オプションサービス契約番号
				String opSvcKeiNo = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_29, X31CWebConst.DATABEAN_GET_VALUE);
				// サブオプションサービスコード
				String sbopSvCd = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_CD_29, X31CWebConst.DATABEAN_GET_VALUE);
				// サブオプションサービス契約ステータス
				String sbopSvcKeiStat = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_KEI_STAT_29, X31CWebConst.DATABEAN_GET_VALUE);
				
				// サブオプションサービス契約情報 サブオプションサービス契約ステータスが「910:解約済」と「920:キャンセル済」の場合
				// スキップ
				if (JFUStrConst.CD00037_910.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_920.equals(sbopSvcKeiStat))
				{
					continue;
				}
				
				// 「D01:メールエイリアス」の場合
				if (opInfoOpSvcKeiNo.equals(opSvcKeiNo) && JFUStrConst.CD00137_D01.equals(sbopSvCd))
				{
					mlAlias = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.ALIAS_29, X31CWebConst.DATABEAN_GET_VALUE) +
										bean.sendMessageString(FUW02301SFConst.SUB_DOMAIN, X31CWebConst.DATABEAN_GET_VALUE);
					mlAliasFlg = true;
				}
				
				// オプションサービス契約番号 = オプションサービス契約情報.オプションサービス契約番号 且つ
				// 「D03:メールウィルスチェック」の場合
				if (opInfoOpSvcKeiNo.equals(opSvcKeiNo) && JFUStrConst.CD00137_D03.equals(sbopSvCd))
				{
					mlViruschkFlg = true;
				}
			}
		}
		
		/////////////////////////////////////////////////////////
		// メールエイリアス                                    //
		// かんたん迷惑メール拒否設定、かんたんメール転送設定、//
		// フィルター設定、迷惑メールチェックサービス          //
		// 旧メールからの転送                                  //
		/////////////////////////////////////////////////////////
		// 「各種設定の引き継ぐ」を選択した場合
		if (mskmSetteHktgFlg)
		{
			// 現在、メールエイリアスをご契約中の場合
			if (mlAliasFlg)
			{
				
				// メールエイリアスをドメイン付で表示
				bean.sendMessageString(FUW02301SFConst.ML_ALIAS, X31CWebConst.DATABEAN_SET_VALUE, mlAlias);
			}
			// 未契約時
			else
			{
				// 「ご利用なし」を表示
				bean.sendMessageString(FUW02301SFConst.ML_ALIAS, X31CWebConst.DATABEAN_SET_VALUE, GORIYOU_NASHI);
			}
			
			// 「eoWEBメールで設定されていた場合は引き継ぐ」を表示
			bean.sendMessageString(FUW02301SFConst.MWKML_SETTE, X31CWebConst.DATABEAN_SET_VALUE, MWKML_SETTE_HIKITUGU);
		}
		// 「各種設定の引き継ぐ」を選択しない場合
		else
		{
			// 現在、メールエイリアスをご契約中の場合
			if (mlAliasFlg)
			{
				
				// メールエイリアスをドメイン付で表示
				bean.sendMessageString(FUW02301SFConst.ML_ALIAS, X31CWebConst.DATABEAN_SET_VALUE, HIKITUGANAI);
			}
			// 未契約時
			else
			{
				// 「ご利用なし」を表示
				bean.sendMessageString(FUW02301SFConst.ML_ALIAS, X31CWebConst.DATABEAN_SET_VALUE, GORIYOU_NASHI);
			}
			
			// 「eoWEBメールで設定されていても引き継がない」を表示
			bean.sendMessageString(FUW02301SFConst.MWKML_SETTE, X31CWebConst.DATABEAN_SET_VALUE, MWKML_SETTE_HIKITUGANAI);
		}
		
		///////////////////////////////////////////////
		//////////////  旧メールからの転送 ////////////
		///////////////////////////////////////////////
		// 「旧メールからの転送」を選択した場合
		if (mskmOldMailTenso)
		{
			// 「eoWEBメールで設定されていても引き継がない」を表示
			bean.sendMessageString(FUW02301SFConst.OLD_MAIL_TENSO_SETTE, X31CWebConst.DATABEAN_SET_VALUE, TENSOU_SURU);
		}
		// 「旧メールからの転送」を選択しない場合
		else
		{
			// 「eoWEBメールで設定されていても引き継がない」を表示
			bean.sendMessageString(FUW02301SFConst.OLD_MAIL_TENSO_SETTE, X31CWebConst.DATABEAN_SET_VALUE, TENSOU_SHINAI);
		}
		
		///////////////////////////////////////////////
		///////  メールウイルスチェックサービス ///////
		///////////////////////////////////////////////
		if (mlViruschkFlg)
		{
			bean.sendMessageString(FUW02301SFConst.MLVIRUSCHK, X31CWebConst.DATABEAN_SET_VALUE, KEIYAKU_CHYU);
		}
		else
		{
			bean.sendMessageString(FUW02301SFConst.MLVIRUSCHK, X31CWebConst.DATABEAN_SET_VALUE, GORIYOU_NASHI);
		}
		
		///////////////////////////////////////////////
		///////////////  メールパスワード /////////////
		///////////////////////////////////////////////
		bean.sendMessageString(FUW02301SFConst.ML_PWD, X31CWebConst.DATABEAN_SET_VALUE, ML_PWD_MONGON);
		
		return bean;
	}

	/**
	 * 共有フォームBeanの情報を取得する。 <BR>
	 * 
	 * @param commoninfoBean
	 * @param index
	 * @return 取得した情報を保持したマップ
	 */
	private Map<String, Object> getCommoninfoBeanInfo(X31SDataBeanAccess commoninfoBean)
	{

		Map<String, Object> resultMap = new HashMap<String, Object>();

		// ○WEB変更情報
		X31SDataBeanAccess webChgInfoBean = commoninfoBean.getDataBeanArray(CommonInfoCFConst.WEB_CHG_INFO).getDataBean(0);
		// ○SSO情報
		X31SDataBeanAccess ssoInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.SSO_INFO).getDataBean(0);

		// SSO情報取得
		String ssoInfoSysid = ssoInfoBean.sendMessageString(CommonInfoCFConst.SYSID_21, X31CWebConst.DATABEAN_GET_VALUE);
		String ssoInfoPopid = ssoInfoBean.sendMessageString(CommonInfoCFConst.POP_ID_21, X31CWebConst.DATABEAN_GET_VALUE);

		// ○現顧客情報
		X31SDataBeanAccess genCustKeiInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO).getDataBean(0);
		// ○サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO).getDataBean(0);
		// ○サービス契約内訳情報
		X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO).getDataBean(0);
		// ○請求契約情報
		X31SDataBeanAccess seikyKeiInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SEIKY_KEI_INFO).getDataBean(0);

		// ○オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = null;

		// オプションサービス契約情報（配列）
		X31SDataBeanAccessArray opSvcKeiInfoArray = svcKeiUcwkInfoBean.getDataBeanArray(CommonInfoCFConst.OP_SVC_KEI_INFO);

		for (int m = 0; m < opSvcKeiInfoArray.getCount(); m++)
		{
			// オプションサービス契約情報（作業用）
			X31SDataBeanAccess tmpOpSvcKeiInfoBean = opSvcKeiInfoArray.getDataBean(m);
			// POPID
			String popId = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.POP_ID_28, X31CWebConst.DATABEAN_GET_VALUE);

			// オプションサービスコード
			String opSvCd = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_CD_28, X31CWebConst.DATABEAN_GET_VALUE);

			// オプションサービス契約ステータス
			String opSvcKeiStat = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_STAT_28, X31CWebConst.DATABEAN_GET_VALUE);

			// オプションサービス契約情報 オプションサービス契約ステータスが「020:照査済」「030:締結済」「100:サービス提供中」が対象
			if (JFUStrConst.CD00037_020.equals(opSvcKeiStat) || JFUStrConst.CD00037_030.equals(opSvcKeiStat)
					|| JFUStrConst.CD00037_100.equals(opSvcKeiStat))
			{
				// POPID = SSO情報.POPID 且つ 「B001:Eメール」の場合
				if (ssoInfoPopid.equals(popId) && JFUStrConst.CD00136_B001.equals(opSvCd))
				{
					// オプションサービス契約情報（確定）
					opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;
					break;
				}
			}
		}

		if (opSvcKeiInfoBean == null)
		{
			// "0102"（契約状態エラー）
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		// ○サブオプションサービス契約情報
		X31SDataBeanAccess sbopSvcKeiInfoBean = null;
		// オプションサービス契約情報のオプションサービス番号
		String opInfoOpSvcKeiNo = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_28, X31CWebConst.DATABEAN_GET_VALUE);
		if (JFUWebCommon.isNull(opInfoOpSvcKeiNo))
		{
			X31SWebLog.DEBUG_LOG.debug("【オプションサービス契約番号未設定エラー】");
			// システムエラーをスロー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// サブオプションサービス契約情報（配列）⇒オプションサービス契約情報の配列の１番目から取得
		X31SDataBeanAccessArray sbopSvcKeiInfoArray = opSvcKeiInfoArray.getDataBean(0).getDataBeanArray(CommonInfoCFConst.SBOP_SVC_KEI_INFO);

		for (int n = 0; n < sbopSvcKeiInfoArray.getCount(); n++)
		{
			// サブオプションサービス契約情報（作業用）
			X31SDataBeanAccess tmpSbopSvcKeiInfoBean = sbopSvcKeiInfoArray.getDataBean(n);

			// オプションサービス契約番号
			String opSvcKeiNo = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_29, X31CWebConst.DATABEAN_GET_VALUE);

			// サブオプションサービス契約ステータス
			String sbopSvcKeiStat =
					tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_KEI_STAT_29, X31CWebConst.DATABEAN_GET_VALUE);

			// サブオプションサービスコード
			String sbopSvCd = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_CD_29, X31CWebConst.DATABEAN_GET_VALUE);

			// サブオプションサービス契約情報 サブオプションサービス契約ステータスが「910:解約済」と「920:キャンセル済」の場合
			// スキップ
			if (JFUStrConst.CD00037_910.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_920.equals(sbopSvcKeiStat))
			{
				continue;
			}

			// オプションサービス契約番号 = オプションサービス契約情報.オプションサービス契約番号 且つ
			// 「D01:メールエイリアス」の場合
			if (opInfoOpSvcKeiNo.equals(opSvcKeiNo) && JFUStrConst.CD00137_D01.equals(sbopSvCd))
			{
				// サブオプションサービス契約情報 サブオプションサービス契約ステータスが「020:照査済」
				// または「030:締結済」または「100:サービス提供中」の場合
				if (JFUStrConst.CD00037_020.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_030.equals(sbopSvcKeiStat)
						|| JFUStrConst.CD00037_100.equals(sbopSvcKeiStat))
				{
					// サブオプションサービス契約情報（確定）
					sbopSvcKeiInfoBean = tmpSbopSvcKeiInfoBean;
				}
				// サブオプションサービス契約情報 サブオプションサービス契約ステータスが「010:受付済」の場合
				// スキップ
				else if (JFUStrConst.CD00037_010.equals(sbopSvcKeiStat))
				{
					continue;
				}
				// サブオプションサービス契約情報 サブオプションサービス契約ステータスが「210:休止・中断中」と「220:停止中」の場合
				else if (JFUStrConst.CD00037_210.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_220.equals(sbopSvcKeiStat))
				{
					// "0102"（契約状態エラー）
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}
			}
		}

		// ●マップにセット
		resultMap.put(CommonInfoCFConst.SYSID_21, ssoInfoSysid); // SYSID
		resultMap.put(CommonInfoCFConst.POP_ID_21, ssoInfoPopid); // POPID
		// Bean情報
		resultMap.put(CommonInfoCFConst.SSO_INFO, ssoInfoBean); // SSO情報
		resultMap.put(CommonInfoCFConst.GEN_CUST_KEI_INFO, genCustKeiInfoBean); // 現顧客情報
		resultMap.put(CommonInfoCFConst.SVC_KEI_INFO, svcKeiInfoBean); // サービス契約情報
		resultMap.put(CommonInfoCFConst.SVC_KEI_UCWK_INFO, svcKeiUcwkInfoBean); // サービス契約内訳情報
		resultMap.put(CommonInfoCFConst.SEIKY_KEI_INFO, seikyKeiInfoBean); // 請求契約情報
		resultMap.put(CommonInfoCFConst.OP_SVC_KEI_INFO, opSvcKeiInfoBean); // オプションサービス契約情報
		resultMap.put(CommonInfoCFConst.SBOP_SVC_KEI_INFO, sbopSvcKeiInfoBean); // サブオプションサービス契約情報

		return resultMap;
	}

	/**
	 * サービスデータのチェック
	 * <br>
	 * @param resultMap
	 */
	private void checkSvcData(Map<String, Object> resultMap)
	{
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);

		// ●現サービス情報チェック処理

		// 現サービス情報のPOPID取得チェック
		// 共有フォームBean.オプションサービス契約情報.オプションサービスコードが「B001:Eメール」のデータが
		// 共有フォームBean.オプションサービス契約情報に存在しない場合
		if (opSvcKeiInfoBean == null)
		{
			// "0102"（契約状態エラー）
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

	}

	/**
	 * 例外の判定処理。 <BR>
	 * 
	 * @param se
	 * @param callMethod
	 */
	private void checkException(JCCWebServiceException se, String callMethod)
	{
		// 例外情報を取得
		X31CMessageResult msgResult = se.getMessageList();
		X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
		X31CMessageMoreInfo info = moreInfo[0];// 関連チェック系は必ずエラーが1つのため0番目から取得する。
		String status = info.getStatus();
		String templateid = info.getTemplateId();
		String itemid = info.getItemId();
		String errFlg = info.getItemCheckErr();

		// エラーを判定
		// 関連チェック
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{
			if (CALL_METHOD_CFM.equals(callMethod))
			{
				// 確認ボタン押下時

				// 業務エラー

				// NGワードチェック
				if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EB.equals(errFlg) && KIBO_ML_ACCOUNT_1.equals(itemid))
				{
					// 業務用例外をthrow
					throw se;
				}
				// エイジングチェック
				if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EB.equals(errFlg) && MLAD.equals(itemid))
				{
					// 業務用例外をthrow
					throw se;
				}

			}
			else
			{
				// 申込ボタン押下時

				// システムエラー

				// NGワードチェック
				if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EB.equals(errFlg) && KIBO_ML_ACCOUNT_1.equals(itemid))
				{
					// システムエラーをthrow（契約状態エラー）
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}
				// エイジングチェック
				if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EB.equals(errFlg) && MLAD.equals(itemid))
				{
					// システムエラーをthrow（契約状態エラー）
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}
			}

			// システムエラー

			// 変更不可期間中チェック
			if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && KIBO_ML_ACCOUNT_1.equals(itemid))
			{
				// システムエラーをthrow（契約状態エラー）
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
			// タイムスタンプチェック
			if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemid))
			{
				// システムエラーをthrow（更新不可エラー）
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0204);
			}

		}

		// 上記以外の場合システムエラーをスロー
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
	}

	/**
	 * マンション区分の情報を取得します。 <BR>
	 * 
	 * @param commoninfoBean
	 * @param outputMap
	 * @return （true:eo光ネットマンションタイプ（プライベート・グローバル・光配線）、
	 *            false:eo光ネットマンションタイプ（プライベート・グローバル・光配線）以外）
	 */
	private boolean getMansionDiv(X31SDataBeanAccess commoninfoBean, HashMap<String, Object> outputMap)
	{

		boolean mansionDiv = false;

		// WEB変更情報
		X31SDataBeanAccess webChgInfoBean = commoninfoBean.getDataBeanArray(CommonInfoCFConst.WEB_CHG_INFO).getDataBean(0);
		// 現顧客情報
		X31SDataBeanAccess genCustKeiInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO).getDataBean(0);
		// サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO).getDataBean(0);

		// 料金グループコード
		String prcGrpCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PRC_GRP_CD_23, X31CWebConst.DATABEAN_GET_VALUE);
		// 加入契約支払方式コード
		String kanyuKeiPayHoshikiCd =
				svcKeiInfoBean.sendMessageString(CommonInfoCFConst.KANYU_KEI_PAY_HOSHIKI_CD_23, X31CWebConst.DATABEAN_GET_VALUE);

		// 料金クループコードが"04"(eo光ネットマンションタイプ )、かつ、加入契約支払方式コードが"003"(全戸一括)、
		// かつ、初期費用がある場合、マンション区分にtrueを設定
		if (JFUStrConst.CD00133_04.equals(prcGrpCd) && JFUStrConst.CD01216_003.equals(kanyuKeiPayHoshikiCd) && chkPayInitialCost(outputMap))
		{
			mansionDiv = true;
		}

		return mansionDiv;
	}

	/**
	 * 無料フラグを設定します。
	 * <br>
	 * @param bean
	 * @param outputMap
	 * @return true:無料 / false:有料
	 */
	private boolean setFreeFlg(X31SDataBeanAccess bean, HashMap<String, Object> outputMap)
	{
		boolean res = true;

		if (chkPayInitialCost(outputMap))
		{
			res = false;
		}

		return res;
	}

	/**
	 * 有料フラグ判定（初期費用）処理です。
	 * @param bean
	 * @param outputMap
	 * @return true:初期費用あり / false:初期費用なし
	 */
	private boolean chkPayInitialCost(HashMap outputMap)
	{
		boolean res = false;
		HashMap parentMap = null;

		if (outputMap.containsKey(CC_TITLE_FUSV006401))
		{
			parentMap = (HashMap)outputMap.get(CC_TITLE_FUSV006401);
		}

		if (null != parentMap && parentMap.containsKey(EKK0721A010_LIST))
		{
			ArrayList childList = (ArrayList)parentMap.get(EKK0721A010_LIST);

			if (childList != null && childList.size() > 0)
			{
				// 初期費用がある場合
				res = true;
			}
			else
			{
				// 初期費用がない場合
				res = false;
			}
		}

		return res;
	}
}
