/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：FUW02001SFLogic
*	ソースファイル名：FUW02001SFLogic.java
*	作成者			：富士通
*	日付			：2011年05月01日
*＜機能概要＞
*	メールエイリアス設定申込のビューロジッククラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/05/01	FJ)谷本		新規作成
*   v3.01.00	2012/03/12	FJ)谷本	   【ANK-0041-00-00】申込完了メール対応
*   v4.00.00    2012/06/14  FJ)瀧澤    【ANK-0381-00-00】IPv6無料文言不備
*   v4.00.00    2012/06/28  FJ)瀧澤    【ANK-1163-00-00】変更系申込が可能となるタイミングについて
*   v4.00		2012/09/22  FJ)岡井	   【ANK-1198-00-00】変更系申込画面の提供条件・利用規約の設置位置について
*   v5.00		2013/08/25  FJ)文元	   【OM-2013-0000911】エイリアス変更年月日未設定でも申し込み可能とする
*   v8.00		2014/01/27  FJ)文元	   【ANK-1589-00-00】消費増税に伴う料金施策
*   v37.00      2018/02/16  FJ)美濃原  【ANK-3366-00-00】eo光設備卸対応
*   
**********************************************************************/
package eo.web.webview.FUW02001SF;

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.constant.JPCOnlineMessageConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JFUCommonRelationCheck;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0055_FUSV0055OPDBMapper;
import eo.web.webview.mapping.FUSV0056_FUSV0056OPDBMapper;

/**
 * メールエイリアス設定申込のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW02001SFLogic extends JCCWebBusinessLogic
{

	/** 申込完了メール 設定 */
	private static final String MSKM_FIN_MAIL_FUW020_1 = "FUW020_1";
	/** 申込完了メール 変更 */
	private static final String MSKM_FIN_MAIL_FUW020_2 = "FUW020_2";

	/** サービスID：メールエイリアス設定申込(新規表示) */
	private static final String USECASE_ID_FUSV0055 = "FUSV0055";
	/** サービスID：メールエイリアス設定申込(申込) */
	private static final String USECASE_ID_FUSV0056 = "FUSV0056";

	/** 料金プラン固定単価（オプション申込料金）一覧照会 */
	private static final String SC_TITLE_FUSV005503 = "FUSV005503SC";
	/** 初期費用一覧照会CC */
	private static final String CC_TITLE_FUSV005501 = "FUSV005501CC";
	/** 画面ID */
	private static final String FUW02001 = "FUW02001";

	/** 登録/変更区分：登録 */
	private static final String ADD_CHG_DIV_ADD = "0";
	/** 登録/変更区分：変更 */
	private static final String ADD_CHG_DIV_CHG = "1";

	/** サブオプションサービス契約<ISP>登録 */
	private static final String EKK0411D010 = "EKK0411D010";
	/** サブオプションサービス契約<ISP>変更 */
	private static final String EKK0411C010 = "EKK0411C010";
	/** 料金プラン固定単価（オプション申込料金）明細 */
	private static final String EKK0601B001_LIST = "EKK0601B001CBSMsg1List";
	/** 初期費用一覧照会明細 */
	private static final String EKK0721A010_LIST = "EKK0721A010CBSMsg1List";
	/** オプションサービス契約番号 */
	private static final String OP_SVC_KEI_NO = "op_svc_kei_no";
	/** 料金プラン固定金額 */
	private static final String PPLAN_KOTEI_AMNT = "pplan_kotei_amnt";
	/** サブオプションサービス契約番号 */
	private static final String SBOP_SVC_KEI_NO = "sbop_svc_kei_no";
	/** 更新年月日時分秒(更新前) */
	private static final String UPD_DTM_BF = "upd_dtm_bf";

	/** 同日を含む */
	private static final String DOUJITSU_FUKUMU = "0";

	/** 置換文字(チェック用) */
	private static final String[] MAIL_ALIAS_NOT_EQUAL_MSG = { "メールエイリアス（再入力）" };
	/** エラー表示画面項目箇所(チェック用) */
	private static final String ERR_PLACE_PWD_RE_IN_MAILALIAS = "re_input_mailalias";

	/** メソッド：確認ボタン押下時 */
	private static final String CALL_METHOD_CFM = "cfm";
	/** メソッド：申込ボタン押下時 */
	private static final String CALL_METHOD_MSKM = "mskm";

	/**
	 * 初期処理
	 * 
	 * @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);
		// サービス契約情報
		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();

		// ●サービス呼び出し処理
		// ホームページURL名取得申込（初期表示）サービスの呼び出しを行う。
		X31SDataBeanAccess[] paramBean = { svcKeiInfoBean };

		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0055);

		FUSV0055_FUSV0055OPDBMapper mapper = new FUSV0055_FUSV0055OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// SC
		// 1.業務パラメータ管理一意照会SC - 契約変更不能日数
		dataMap = mapper.setFUSV005501SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 2.NGワード一覧照会SC
		dataMap = mapper.setFUSV005502SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 3.料金プラン固定単価（オプション申込料金）一覧照会
		dataMap = mapper.setFUSV005503SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 4.料金コース_サブオプションサービス一意照会
		dataMap = mapper.setFUSV005504SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// CC
		// 初期費用一覧照会CC
		mapper.setFUSV005501CC(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);
		}

		// ●サービス処理結果の取得
		// 1.業務パラメータ管理一意照会SC - 契約変更不能日数
		bean = mapper.getFUSV005501SC(bean, outputMap);
		// 2.NGワード一覧照会(フロント)
		bean = mapper.getFUSV005502SC(bean, outputMap);
		// 4.料金コース_サブオプションサービス一意照会
		bean = mapper.getFUSV005504SC(bean, outputMap);

		// ●後チェック
		// エイリアス変更不可期間確認処理
		// 共有フォームBean.サブオプションサービス契約情報.エイリアス変更年月日から、FUW02001SF.変更不可期間日数を経過していない場合
		if (sbopSvcKeiInfoBean != null)
		{
			String aliasChgeYmd = sbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.ALIAS_CHGE_YMD_29, X31CWebConst.DATABEAN_GET_VALUE);
			int keiChgStpPrd = Integer.parseInt((bean.sendMessageString(FUW02001SFConst.KEI_CHG_STP_PRD, X31CWebConst.DATABEAN_GET_VALUE)));
			// メールエイリアス変更年月日＋変更不可期間日数＞システム日の場合エラー
			if ((!JFUWebCommon.isNull(aliasChgeYmd)) && JFUWebCommon.isFutureDate(JFUWebCommon.addDay(aliasChgeYmd, keiChgStpPrd), JFUWebCommon.getOpeDate(this, null), DOUJITSU_FUKUMU))
			{
				// "0101"（利用制限エラー）
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0101);
			}
		}

		// ● ビーンの設定
		// 現在のメールアドレス
		String mlAd = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.MLAD_28, X31CWebConst.DATABEAN_GET_VALUE);
		bean.sendMessageString(FUW02001SFConst.NOW_MLAD, X31CWebConst.DATABEAN_SET_VALUE, mlAd);
		// サブドメイン
		bean.sendMessageString(FUW02001SFConst.SUB_DOMAIN, X31CWebConst.DATABEAN_SET_VALUE, mlAd.split(JFUStrConst.ATMARK)[1]);

		// 登録/変更区分
		String add_chg_div = ADD_CHG_DIV_ADD; // 新規登録
		if (sbopSvcKeiInfoBean != null)
		{
			add_chg_div = ADD_CHG_DIV_CHG; // 変更
		}
		// ●料金表の制御
		// 有料フラグをサービスフォームbeanに設定
		boolean payFlag = bean.sendMessageBoolean(FUW02001SFConst.PAY_FLG, X31CWebConst.DATABEAN_SET_VALUE, setPayFlg(bean, outputMap));
		// 有料フラグがfalse（無料）もしくは、メールエイリアス変更画面の場合は、料金表表示を無料の表示にする。
		if (payFlag == false || ADD_CHG_DIV_CHG.equals(add_chg_div))
		{
			// 無料表示用の基本料金情報を設定する。
			JFUWebCommon.setFreePrcInfoMap(outputMap, SC_TITLE_FUSV005503);
		}

		// ●料金表マッピング
		JFUWebCommon.setPrcInfoArea(bean, outputMap, SC_TITLE_FUSV005503, CC_TITLE_FUSV005501, FUW02001);
		bean.sendMessageString(FUW02001SFConst.ADD_CHG_DIV, X31CWebConst.DATABEAN_SET_VALUE, add_chg_div);
		// マンション区分
		bean.sendMessageBoolean(FUW02001SFConst.MANSION_DIV, X31CWebConst.DATABEAN_SET_VALUE, getMansionDiv(commoninfoBean, outputMap, payFlag));
		// 現在のメールエイリアス
		if (sbopSvcKeiInfoBean != null)
		{
			bean.sendMessageString(FUW02001SFConst.NOW_MAILALIAS, X31CWebConst.DATABEAN_SET_VALUE, sbopSvcKeiInfoBean.sendMessageString(
					CommonInfoCFConst.ALIAS_29, X31CWebConst.DATABEAN_GET_VALUE)
					+ JFUStrConst.ATMARK + bean.sendMessageString(FUW02001SFConst.SUB_DOMAIN, X31CWebConst.DATABEAN_GET_VALUE));
		}

		// 料金表表示現在日設定処理
		JFUWebCommon.setPrcDspNowDay(this);
		
		// -------- 遷移先画面の指定 --------
		// 遷移先画面IDを設定（画面機能の先頭になる場合の固定ロジック）
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getScreenId(this));
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02001);

		return true;
	}

	/**
	 * 申込画面の確認ボタン押下
	 * 
	 * @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 seikyKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SEIKY_KEI_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();

		// ●再入力値チェック
		String reInputMailAlias = bean.sendMessageString(FUW02001SFConst.RE_INPUT_MAILALIAS, X31CWebConst.DATABEAN_GET_VALUE);
		if (!JFUWebCommon.isNull(reInputMailAlias)
				&& !reInputMailAlias.equals(bean.sendMessageString(FUW02001SFConst.MAILALIAS, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// エラー
			JFUWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKF0400_TW, MAIL_ALIAS_NOT_EQUAL_MSG, ERR_PLACE_PWD_RE_IN_MAILALIAS);
			return true;
		}

		// ●サービス呼び出し処理
		// メールエイリアス設定申込(新規表示)申込（申込み）サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0056);

		FUSV0056_FUSV0056OPDBMapper mapper = new FUSV0056_FUSV0056OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = { bean, ssoInfoBean, seikyKeiInfoBean, svcKeiInfoBean, opSvcKeiInfoBean, sbopSvcKeiInfoBean };

		// SC
		// 1.申込内容承認登録
		dataMap = mapper.setFUSV005601SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 2.サブオプションサービス契約<ISP>登録
		dataMap = mapper.setFUSV005602SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 10.サブオプションサービス契約<ISP>照査
		dataMap = mapper.setFUSV005610SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 3.サブオプションサービス契約<ISP>照査締結
		dataMap = mapper.setFUSV005603SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 4.サブオプションサービス契約<ISP>使用開始
		dataMap = mapper.setFUSV005604SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 5.サブオプションサービス契約<ISP>変更
		dataMap = mapper.setFUSV005605SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 6.エイジング対象使用終了
		dataMap = mapper.setFUSV005606SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 7.エイジング対象登録
		dataMap = mapper.setFUSV005607SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 8.進捗登録
		dataMap = mapper.setFUSV005608SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 9.申込明細照査・後続業務依頼
		dataMap = mapper.setFUSV005609SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);

		// CC
		// 1.サブオプションサービス契約<ISP>一意照会CC
		dataMap = mapper.setFUSV005601CC(paramBean, dataMap);
		// 2.エイジング一覧照会(エイジング対象値)CC
		dataMap = mapper.setFUSV005602CC(paramBean, dataMap);
		// 3.サービスIF結果データ移送
		dataMap = mapper.setFUSV005603CC(paramBean, dataMap);
		// 4.サービスIF結果データ移送
		dataMap = mapper.setFUSV005604CC(paramBean, dataMap, this);
		// 5.サービスオーダ発行
		dataMap = mapper.setFUSV005605CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);

		// ●オプションサービス契約ステータス設定
		JFUWebCommon.setOpSvcKeiStatMail(this, dataMap);

		// 検索結果格納用マップを生成。
		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_FUW02002);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02002);

		return true;
	}

	/**
	 * 確認画面の申し込むボタン押下
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean mskm() throws Exception
	{

		// ●共通関連チェックの呼び出し処理
		JFUCommonRelationCheck.checkCommonRelation(this, USECASE_ID_FUSV0056);

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより現顧客契約情報を取得する。
		Map<String, Object> resultMap = getCommoninfoBeanInfo(commoninfoBean);
		// SSO情報
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SSO_INFO);
		// 請求契約情報
		X31SDataBeanAccess seikyKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SEIKY_KEI_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();

		// ●サービス呼び出し処理
		// メールエイリアス設定申込(新規表示)申込（申込み）サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0056);

		FUSV0056_FUSV0056OPDBMapper mapper = new FUSV0056_FUSV0056OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = { bean, ssoInfoBean, seikyKeiInfoBean, svcKeiInfoBean, opSvcKeiInfoBean, sbopSvcKeiInfoBean };

		// SC
		// 1.申込内容承認登録
		dataMap = mapper.setFUSV005601SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 2.サブオプションサービス契約<ISP>登録
		dataMap = mapper.setFUSV005602SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 10.サブオプションサービス契約<ISP>照査
		dataMap = mapper.setFUSV005610SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 3.サブオプションサービス契約<ISP>照査締結
		dataMap = mapper.setFUSV005603SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 4.サブオプションサービス契約<ISP>使用開始
		dataMap = mapper.setFUSV005604SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 5.サブオプションサービス契約<ISP>変更
		dataMap = mapper.setFUSV005605SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 6.エイジング対象使用終了
		dataMap = mapper.setFUSV005606SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 7.エイジング対象登録
		dataMap = mapper.setFUSV005607SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 8.進捗登録
		dataMap = mapper.setFUSV005608SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 9.申込明細照査・後続業務依頼
		dataMap = mapper.setFUSV005609SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// CC
		// 1.サブオプションサービス契約<ISP>一意照会CC
		dataMap = mapper.setFUSV005601CC(paramBean, dataMap);
		// 2.エイジング一覧照会(エイジング対象値)CC
		dataMap = mapper.setFUSV005602CC(paramBean, dataMap);
		// 3.サービスIF結果データ移送
		dataMap = mapper.setFUSV005603CC(paramBean, dataMap);
		// 4.サービスIF結果データ移送
		dataMap = mapper.setFUSV005604CC(paramBean, dataMap, this);
		// 5.サービスオーダ発行
		dataMap = mapper.setFUSV005605CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// ●オプションサービス契約ステータス設定
		JFUWebCommon.setOpSvcKeiStatMail(this, dataMap);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();
		try
		{
			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);

		}
		catch (JCCWebServiceException se)
		{
			checkException(se, CALL_METHOD_MSKM);
		}

		// ●現顧客リフレッシュ処理
		JFUWebCommon.refreshGenCustKei(this);

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより現顧客契約情報を取得する。
		resultMap = getCommoninfoBeanInfo(commoninfoBean);
		// オプションサービス契約情報
		opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);
		// サブオプションサービス契約情報
		sbopSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SBOP_SVC_KEI_INFO);

		// ●Beanにセット
		// メールアドレス ← 共有フォームBean.オプションサービス契約情報.メールアドレス
		bean.sendMessageString(FUW02001SFConst.NOW_MLAD, X31CWebConst.DATABEAN_SET_VALUE, opSvcKeiInfoBean.sendMessageString(
				CommonInfoCFConst.MLAD_28, X31CWebConst.DATABEAN_GET_VALUE));
		// 確定メールエイリアス ← 共有フォームBean.サブオプションサービス契約情報.エイリアス
		if (sbopSvcKeiInfoBean != null)
		{
			bean.sendMessageString(FUW02001SFConst.NOW_MAILALIAS, X31CWebConst.DATABEAN_SET_VALUE, sbopSvcKeiInfoBean.sendMessageString(
					CommonInfoCFConst.ALIAS_29, X31CWebConst.DATABEAN_GET_VALUE));
		}

		String addChgDiv = bean.sendMessageString(FUW02001SFConst.ADD_CHG_DIV, X31CWebConst.DATABEAN_GET_VALUE);

		if (ADD_CHG_DIV_ADD.equals(addChgDiv))
		{
			// 申込完了メール送信部品呼出処理
			JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW020_1);
		}
		else if (ADD_CHG_DIV_CHG.equals(addChgDiv))
		{
			// 申込完了メール送信部品呼出処理
			JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW020_2);
		}

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW02003);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02003);

		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_FUW02001);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02001);

		return true;
	}

	/**
	 * サービスデータのチェック
	 * <br>
	 * @param resultMap
	 */
	private void checkSvcData(Map<String, Object> resultMap)
	{
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);

		// ●現サービス情報チェック処理

		// サービス情報無しチェック
		// 共有フォームBean.SSO情報.POPIDが、共有フォームBean.オプションサービス契約情報.POPIDと等しくない場合
		if (opSvcKeiInfoBean == null)
		{
			// "0102"（契約状態エラー）
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

	}

	/**
	 * 共有フォームBeanの情報を取得します。 <BR>
	 * 
	 * @param commoninfoBean
	 * @param fixMlad
	 * @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);

			// オプションサービス契約情報 オプションサービス契約ステータスが「100:サービス提供中」
			// オプションサービス契約情報 オプションサービス契約ステータスが「020:照査済」
			// オプションサービス契約情報 オプションサービス契約ステータスが「030:締結済」
			// 以外の場合、スキップ
			if (!JFUStrConst.CD00037_100.equals(opSvcKeiStat) && !JFUStrConst.CD00037_020.equals(opSvcKeiStat)
					&& !JFUStrConst.CD00037_030.equals(opSvcKeiStat))
			{
				continue;
			}

			// サービス提供中 且つ POPID = SSO情報.POPID 且つ 「B001:Eメール」の場合
			if (ssoInfoPopid.equals(popId) && JFUStrConst.CD00136_B001.equals(opSvCd))
			{
				// オプションサービス契約情報（確定）
				opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;

			}
		}

		// ○サブオプションサービス契約情報
		X31SDataBeanAccess sbopSvcKeiInfoBean = null;
		if (opSvcKeiInfoBean != 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))
				{
					// サブオプションサービス契約情報（確定）
					sbopSvcKeiInfoBean = tmpSbopSvcKeiInfoBean;
				}
			}
		}

		// ☆☆マップにセット☆
		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 commoninfoBean
	 * @param outputMap
	 * @return 結果(true:マンション(全戸一括) false:マンション(全戸一括)以外)
	 */
	private Boolean getMansionDiv(X31SDataBeanAccess commoninfoBean, HashMap<String, Object> outputMap, boolean payFlag)
	{

		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"(ネットマンション)、かつ、加入契約支払方式コードが"003"(全戸一括)
		// かつ、固定単価または初期費用が有料の場合、マンション区分にTRUEを設定する
		if (JFUStrConst.CD00133_04.equals(prcGrpCd) && JFUStrConst.CD01216_003.equals(kanyuKeiPayHoshikiCd) 
				&& (payFlag))
		{
			mansionDiv = true;
		}

		return mansionDiv;
	}

	/**
	 * 例外の判定処理。<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 templateid = info.getTemplateId();
		String itemid = info.getItemId();
		String status = info.getStatus();
		String errFlg = info.getItemCheckErr();

		// エラーを判定
		// 関連チェック
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{

			if (CALL_METHOD_CFM.equals(callMethod))
			{
				// 確認ボタン押下時

				// 業務エラー

				/** 登録時 **/
				// EKK0411D010_サブオプションサービス契約<ISP>登録
				// NGワードチェック
				if (EKK0411D010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EH.equals(errFlg) && OP_SVC_KEI_NO.equals(itemid))
				{
					// 業務エラー例外クラスをthrow
					throw se;
				}
				// エイジングチェック
				if (EKK0411D010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EI.equals(errFlg) && OP_SVC_KEI_NO.equals(itemid))
				{
					// 業務エラー例外クラスをthrow
					throw se;
				}

				/** 変更時 **/
				// EKK0411C010_サブオプションサービス契約<ISP>変更
				// NGワードチェック
				if (EKK0411C010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EF.equals(errFlg) && SBOP_SVC_KEI_NO.equals(itemid))
				{
					// 業務エラー例外クラスをthrow
					throw se;
				}
				// エイジングチェック
				if (EKK0411C010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EG.equals(errFlg) && SBOP_SVC_KEI_NO.equals(itemid))
				{
					// 業務エラー例外クラスをthrow
					throw se;
				}

			}
			else
			{
				// 申込ボタン押下時

				// システムエラー

				/** 登録時 **/
				// EKK0411D010_サブオプションサービス契約<ISP>登録
				// NGワードチェック
				if (EKK0411D010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EH.equals(errFlg) && OP_SVC_KEI_NO.equals(itemid))
				{
					// システムエラーをthrow（契約状態エラー）
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}
				// エイジングチェック
				if (EKK0411D010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EI.equals(errFlg) && OP_SVC_KEI_NO.equals(itemid))
				{
					// システムエラーをthrow（契約状態エラー）
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}

				/** 変更時 **/
				// EKK0411C010_サブオプションサービス契約<ISP>変更
				// NGワードチェック
				if (EKK0411C010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EF.equals(errFlg) && SBOP_SVC_KEI_NO.equals(itemid))
				{
					// システムエラーをthrow（契約状態エラー）
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}
				// エイジングチェック
				if (EKK0411C010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EG.equals(errFlg) && SBOP_SVC_KEI_NO.equals(itemid))
				{
					// システムエラーをthrow（契約状態エラー）
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}
			}

			// タイムスタンプチェック
			if (EKK0411D010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemid))
			{
				// システムエラーをthrow（更新不可エラー）
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0204);
			}
			// オプション契約上限チェック
			if (EKK0411C010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EH.equals(errFlg) && SBOP_SVC_KEI_NO.equals(itemid))
			{
				// システムエラーをthrow（利用制限エラー）
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0101);
			}
			// タイムスタンプチェック
			if (EKK0411C010.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 bean
	 * @param outputMap
	 * @return true:有料 / false:無料（支払い金なし）
	 */
	private boolean setPayFlg(X31SDataBeanAccess bean, HashMap<String, Object> outputMap)
	{
		boolean res = false;
		int muryoCnt = bean.sendMessageLong(FUW02001SFConst.SVCTK_BUT_MRYO_VALUE, X31CWebConst.DATABEAN_GET_VALUE).intValue();

		if (chkPayKoteiTanka(outputMap))
		{
			if (muryoCnt <= 0)
			{
				// 固定単価あり＆無料数なし
				res = true;
			}
			else
			{
				// 固定単価あり＆無料数あり
				res = false;
			}
		}
		else
		{
			// 固定単価なし
			res = false;
		}

		return res;
	}

	/**
	 * 有料フラグ判定（固定単価）処理です。
	 * @param bean
	 * @param outputMap
	 * @return true:固定単価あり / false:固定単価なし（無料）
	 */
	@SuppressWarnings("unchecked")
	private boolean chkPayKoteiTanka(HashMap outputMap)
	{
		boolean res = false;
		HashMap parentMap = null;

		if (outputMap.containsKey(SC_TITLE_FUSV005503))
		{
			parentMap = (HashMap)outputMap.get(SC_TITLE_FUSV005503);
		}

		if (null != parentMap && parentMap.containsKey(EKK0601B001_LIST))
		{
			ArrayList childList = (ArrayList)parentMap.get(EKK0601B001_LIST);

			if (childList != null && childList.size() > 0)
			{
				for (int i = 0; i < childList.size(); i++)
				{
					HashMap childmap = (HashMap)childList.get(i);

					if (Integer.parseInt((String)childmap.get(PPLAN_KOTEI_AMNT)) > 0)
					{
						// 固定単価が0円以上の場合
						res = true;
					}
					else
					{
						// 固定単価が0円の場合
						res = false;
					}
				}
			}
			else
			{
				// 固定単価がない場合
				res = false;
			}
		}

		return res;
	}

	/**
	 * 有料フラグ判定（初期費用）処理です。
	 * @param bean
	 * @param outputMap
	 * @return true:初期費用あり / false:初期費用なし
	 */
	@SuppressWarnings("unchecked")
	private boolean chkPayInitialCost(HashMap outputMap)
	{
		boolean res = false;
		HashMap parentMap = null;

		if (outputMap.containsKey(CC_TITLE_FUSV005501))
		{
			parentMap = (HashMap)outputMap.get(CC_TITLE_FUSV005501);
		}

		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;
	}

}
