/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：FUW11401SFLogic
 *   ソースファイル名：FUW11401SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2015年01月26日
 *＜機能概要＞
 *   Web契約容量削減申込のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2015/01/26   FJ）中西    新規作成
 *   v37.00      2018/02/16   FJ) 美濃原  【ANK-3366-00-00】eo光設備卸対応
 *
 **********************************************************************/
package eo.web.webview.FUW11401SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0288_FUSV0288OPDBMapper;
import eo.web.webview.mapping.FUSV0289_FUSV0289OPDBMapper;

/**
 * Web契約容量削減申込のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW11401SFLogic extends JCCWebBusinessLogic
{

	/** 申込完了メール 申込 */
	private static final String MSKM_FIN_MAIL_FUW114_1 = "FUW114_1";

	/** サービスID：Web契約容量削減申込(初期表示) */
	private static final String USECASE_ID_FUSV0289 = "FUSV0289";
	/** サービスID：Web契約容量削減申込(申込) */
	private static final String USECASE_ID_FUSV0288 = "FUSV0288";
	/** 単位 MB */
	private static final String UNIT_MB = "MB";
	/** web契約容量削減単位（MB） */
	private static final int WEB_CAPA_DSL_UNIT_MB = 5;

	/** エラー判定用テンプレート：オプションサービス契約同月内変更チェック(EKK0351B003) */
	private static final String EKK0351B003 = "EKK0351B003";
	/** エラー判定用キーワード：当月申込エラー */
	private static final String THIS_MONTH_MSKM = "this_month_mskm";

	/** エラー判定用アイテム：更新年月日時分秒(更新前) */
	private static final String UPD_DTM_BF = "upd_dtm_bf";

	/** リモートコマンド実行用環境定義ファイル[WWWサーバ] */
	private static final String FU_C_WWW_ENV = "FU_C_WWW_ENV";
	/** コマンド正常終了 */
	private static final String SUCCESS = "0";
	/** Web使用量照会依頼：正常終了 */
	private static final String INQ_SUCCESS = "120000";
	/** 外部API(Web使用量照会依頼処理)用照会コマンド */
	private static final String FU_C_FUIFE009_PARAM1 = "FU_C_FUIFE009_PARAM1";
	/** 改行コード\n */
	private static final String RETURN_CODE2 = "\n";
	/** 改行コード\r */
	private static final String RETURN_CODE1 = "\r";
	/** 空文字 */
	private static final String BLANK = JFUStrConst.EMPTY;
	/** 選択文言 */
	private static final String SEL_MONGON = "選択してください";

	/**
	 * 初期処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{

		// -------------------------------------------------
		// ■設備卸チェック
		// -------------------------------------------------
		JFUWebCommon.checkOrosi(this);

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// -------------------------------------------------
		// ■Web契約容量削減申込(初期表示)サービス実行
		// -------------------------------------------------
		executeInitService(commonInfoBean, serviceFormBean);

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面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_FUW11401);

		return true;
	}

	/**
	 * 申込画面の確認ボタン押下処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean cfm() throws Exception
	{

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// ---- サービスフォームbean ----
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// -------------------------------------------------
		// ■Web契約容量削減申込(申込)サービス実行
		// -------------------------------------------------
		executeMskmService(commonInfoBean, serviceFormBean, JPCModelConstant.FUNC_CD_2);

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW11402);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW11402);

		return true;
	}

	/**
	 * 確認画面の申し込むボタン押下処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean mskm() throws Exception
	{

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// ---- サービスフォームbean ----
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// -------------------------------------------------
		// ■Web契約容量削減申込(申込)サービス実行
		// -------------------------------------------------
		executeMskmService(commonInfoBean, serviceFormBean, JPCModelConstant.FUNC_CD_1);

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW11403);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW11403);

		return true;
	}

	/**
	 * 確認画面の戻るボタン押下処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean back() throws Exception
	{

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// ---- 共有フォームbean ----
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW11401);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW11401);

		return true;
	}

	/**
	 * Web契約容量削減申込(初期表示)サービス実行処理
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param serviceFormBean Web契約容量削減申込サービスフォームBean
	 * @throws Exception
	 */
	private void executeInitService(final X31SDataBeanAccess commonInfoBean, final X31SDataBeanAccess serviceFormBean) throws Exception
	{
		DEBUG_LOG.info("----- FUW11401 Start executeInitService -----");

		// ●共有フォーム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);

		// ●サービス呼び出し処理
		// Web契約容量削減申込（初期表示）サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0289);

		FUSV0289_FUSV0289OPDBMapper mapper = new FUSV0289_FUSV0289OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// ●サービス呼び出し処理
		// ホームページURL名取得申込（初期表示）サービスの呼び出しを行う。
		X31SDataBeanAccess[] paramBean = { serviceFormBean, ssoInfoBean, svcKeiInfoBean, opSvcKeiInfoBean };

		// 1.ネットオプションサービス契約取得CC(FUSV028901CC)
		dataMap = mapper.setFUSV028901CC_HP(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		try
		{
			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);

		}
		catch (JCCWebServiceException se)
		{
			// 関連チェックを行う
			handleInitException(se);
		}

		// ●サービス処理結果の取得
		// 1.ネットオプションサービス契約取得CC(FUSV028901CC)
		mapper.getFUSV028901CC_HP(serviceFormBean, outputMap);

		// ●ビーンの設定
		// 現在のＷｅｂＩＤ
		serviceFormBean.sendMessageString(FUW11401SFConst.NOW_WEB_ID, X31CWebConst.DATABEAN_SET_VALUE, opSvcKeiInfoBean.sendMessageString(
				CommonInfoCFConst.WEB_ID_28, X31CWebConst.DATABEAN_GET_VALUE));

		// 現在のホームページURL
		serviceFormBean.sendMessageString(FUW11401SFConst.NOW_HP_URL, X31CWebConst.DATABEAN_SET_VALUE, serviceFormBean.sendMessageString(
				FUW11401SFConst.URL_PROTOCOL, X31CWebConst.DATABEAN_GET_VALUE)
				+ opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.URL_DOMAIN_28, X31CWebConst.DATABEAN_GET_VALUE)
				+ opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.URL_ACCOUNT_28, X31CWebConst.DATABEAN_GET_VALUE));

		// 現在のＷｅｂ契約容量
		int nowWebKeiCapa = Long.valueOf(opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.CAPA_28, X31CWebConst.DATABEAN_GET_VALUE)).intValue();
		serviceFormBean.sendMessageString(FUW11401SFConst.NOW_WEB_KEI_CAPA, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(nowWebKeiCapa));

		// 初期容量
		int shkCapa = serviceFormBean.sendMessageLong(FUW11401SFConst.SHK_CAPA, X31CWebConst.DATABEAN_GET_VALUE).intValue();

		// 追加したＷｅｂ契約容量の合計
		int addCapaTotal = (nowWebKeiCapa - shkCapa) < 0 ? 0 : nowWebKeiCapa - shkCapa;
		serviceFormBean.sendMessageString(FUW11401SFConst.ADD_CAPA_TOTAL, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(addCapaTotal));

		// 現在のＷｅｂ利用容量
		getNowWebUseCapa(commonInfoBean, serviceFormBean, opSvcKeiInfoBean);
		int nowWebUseCapa =
				Long.valueOf(serviceFormBean.sendMessageString(FUW11401SFConst.NOW_WEB_USE_CAPA, X31CWebConst.DATABEAN_GET_VALUE)).intValue();
		int nowWebUseCapaForCalcDslPsbWebKeiCapa = (nowWebUseCapa > 0 && nowWebUseCapa < WEB_CAPA_DSL_UNIT_MB) ? WEB_CAPA_DSL_UNIT_MB : nowWebUseCapa;
		int surplusWebCapaDslUnitMb = nowWebUseCapaForCalcDslPsbWebKeiCapa % WEB_CAPA_DSL_UNIT_MB;
		if (surplusWebCapaDslUnitMb > 0)
		{
			nowWebUseCapaForCalcDslPsbWebKeiCapa = nowWebUseCapaForCalcDslPsbWebKeiCapa - surplusWebCapaDslUnitMb + WEB_CAPA_DSL_UNIT_MB;
		}

		// 最低確保しなければならない容量（初期容量、または、現在のＷｅｂ利用容量の大きい方）
		int dslUnpsbWebKeiCapa = shkCapa >= nowWebUseCapaForCalcDslPsbWebKeiCapa ? shkCapa : nowWebUseCapaForCalcDslPsbWebKeiCapa;

		// 削減可能Web契約容量
		int dslPsbWebKeiCapa = (nowWebKeiCapa - dslUnpsbWebKeiCapa) < WEB_CAPA_DSL_UNIT_MB ? 0 : nowWebKeiCapa - dslUnpsbWebKeiCapa;
		serviceFormBean.sendMessageString(FUW11401SFConst.DSL_PSB_WEB_KEI_CAPA, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(dslPsbWebKeiCapa));

		// 削減可能Web契約容量が0以下の場合
		if (dslPsbWebKeiCapa <= 0)
		{
			// 解約可能フラグをfalseに設定
			serviceFormBean.sendMessageBoolean(FUW11401SFConst.DSL_ENABLED_FLG, X31CWebConst.DATABEAN_SET_VALUE, false);
		}
		else
		{
			// 解約可能フラグをtrueに設定
			serviceFormBean.sendMessageBoolean(FUW11401SFConst.DSL_ENABLED_FLG, X31CWebConst.DATABEAN_SET_VALUE, true);
		}

		// 選択オプションデータ作成
		createOptioinData(serviceFormBean);

		DEBUG_LOG.info("----- FUW11401 End executeInitService -----");
	}

	/**
	 * 現在のＷｅｂ利用容量取得処理
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param serviceFormBean Web契約容量削減申込サービスフォームBean
	 * @param opSvcKeiInfoBean オプションサービス契約情報
	 * @throws Exception
	 */
	private void getNowWebUseCapa(final X31SDataBeanAccess commonInfoBean, final X31SDataBeanAccess serviceFormBean,
			final X31SDataBeanAccess opSvcKeiInfoBean) throws Exception
	{

		// 現在のＷｅｂＩＤ
		String nowWebId = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.WEB_ID_28, X31CWebConst.DATABEAN_GET_VALUE);

		// ●外部API呼び出し

		Map<String, String> apiParamMap = new HashMap<String, String>();

		apiParamMap.put(FUW11401SFConst.NOW_WEB_ID, nowWebId);

		String resultCode = JFUStrConst.EMPTY;
		List<String> resultCodeList = new ArrayList<String>();
		List<String> dataList = new ArrayList<String>();

		resultCode = execSync(resultCodeList, apiParamMap, dataList);
		if (INQ_SUCCESS.equals(resultCode))
		{
		}
		else
		{
			// 混雑中エラー(0004)
			DEBUG_LOG.info("■■■ 混雑中エラー(0004)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0004);
		}

		// ●外部API呼出結果処理
		long lngWebCapa = Long.parseLong(dataList.get(1).replace(RETURN_CODE1, BLANK).replace(RETURN_CODE2, BLANK));

		// 小数点以下切り上げ
		BigDecimal capa = new BigDecimal(lngWebCapa).divide(new BigDecimal(1024));
		capa = capa.setScale(0, BigDecimal.ROUND_UP);
		// 整数値に変換した結果を確認
		if (lngWebCapa > 0 && capa.compareTo(BigDecimal.ZERO) == 0)
		{
			// 0KBより大きく、整数値で切り上げた値が0の場合は1を設定
			capa = BigDecimal.ONE;
		}

		// 現在のＷｅｂ利用容量を設定
		serviceFormBean.sendMessageString(FUW11401SFConst.NOW_WEB_USE_CAPA, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(capa));

	}

	/**
	 * 外部API呼出処理(Web照会依頼処理)を行います。 <BR>
	 * 
	 * @param resultCodeList 処理結果コード
	 * @param paramMap パラメータマップ
	 * @param dataList データリスト
	 * @return 処理結果コード
	 */
	private String execSync(List<String> resultCodeList, Map<String, String> paramMap, List<String> dataList)
	{

		String[] cmd =
				{ JCCWebCommon.getApplicationConst(JFUStrConst.REMOTE_CMD_NM), JCCWebCommon.getApplicationConst(JFUStrConst.REMOTE_CMD_OP1),
						JCCWebCommon.getApplicationConst(FU_C_FUIFE009_PARAM1), paramMap.get(FUW11401SFConst.NOW_WEB_ID),
						JCCWebCommon.getApplicationConst(JFUStrConst.REMOTE_CMD_OP2), JCCWebCommon.getApplicationConst(FU_C_WWW_ENV) };

		String resultCode = execSync(cmd, dataList);
		if (!INQ_SUCCESS.equals(resultCode))
		{
			resultCodeList.add(resultCode);
		}

		return resultCode;

	}

	/**
	 * 外部API呼出処理を行います。 <BR>
	 * 
	 * @param cmd 処理結果コード
	 * @param dataList データリスト
	 * @return 処理結果コード
	 */
	private String execSync(String[] cmd, List<String> dataList)
	{

		// 実行結果
		String result = null;

		// 外部コマンド実行標準出力格納
		StringBuffer outPut = new StringBuffer();

		// 外部コマンド実行処理
		String execSyncCode =
				JCCWebCommon.execSync(cmd, outPut, Integer.parseInt(JCCWebCommon.getApplicationConst(JFUStrConst.REMOTE_EXEC_TIME_OUT)));

		// 外部コマンド実行結果
		if (SUCCESS.equals(execSyncCode))
		{

			// List<String> resultList = null;
			if (0 < outPut.length())
			{
				// 出力結果をListに詰め直す。
				dataList.addAll(Arrays.asList(delKaigyo(outPut.toString()).split(JFUStrConst.HALF_SPACE, 0)));
				// 実行結果
				result = dataList.get(0);
			}
		}
		else
		{
			// システムエラー(0002)
			DEBUG_LOG.info("■■■ システムエラー(0002)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}
		return result;
	}

	/**
	 * 改行コードを除去し返却します。
	 * 
	 * <br>
	 * @param str 文字列
	 * @return 改行コードを除去した文字列

	 */
	public String delKaigyo(String str)
	{
		// 入力パラメータ検査
		if (str == null)
		{
			return JFUStrConst.EMPTY;
		}

		// 出力用領域
		String outPutStr = str;

		// 改行コードを空文字に変換
		outPutStr = outPutStr.replace(JFUStrConst.RETURN_CODE, "");

		// 文字列を返却
		return outPutStr;
	}

	/**
	 * 初期表示時例外ハンドリング処理
	 * <br/>
	 * 申込処理時に発生した業務例外のハンドリングを行ないます。
	 *
	 * @param jwse 初期処理時に発生したJCCWebServiceExceptionオブジェクト
	 */
	private void handleInitException(JCCWebServiceException jwse)
	{
		// 例外情報を取得
		X31CMessageResult msgResult = jwse.getMessageList();
		X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
		// 関連チェック系は必ずエラーが1つのため0番目から取得する。
		X31CMessageMoreInfo info = moreInfo[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))
		{
			// -------------------------------------------------
			// ■同月内変更チェック
			// -------------------------------------------------
			// エラー判定用テンプレートが"EKK0401B003"かつ エラーフラグが"EA"かつアイテムIDが当月申込エラーの場合
			if (EKK0351B003.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && THIS_MONTH_MSKM.equals(itemid))
			{
				// 解約対象オプション当月受付済エラー(0136)
				DEBUG_LOG.info("■■■ 解約対象オプション当月受付済エラー(0136)");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0136); // "0136"：解約対象オプション当月受付済エラー
			}
		}

		// システムエラー(0002)
		DEBUG_LOG.info("■■■ システムエラー(0002)");
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
	}

	/**
	 * Web契約容量削減申込(申込)サービス実行処理
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param serviceFormBean Web契約容量削減申込サービスフォームBean
	 * @param funcCd 機能コード
	 * @return サービス処理結果マップ
	 * @throws Exception 
	 */
	private void executeMskmService(final X31SDataBeanAccess commonInfoBean, final X31SDataBeanAccess serviceFormBean, String funcCd)
			throws Exception
	{

		// ●共有フォーム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);

		// 確認の場合
		if (JPCModelConstant.FUNC_CD_2.equals(funcCd))
		{

			// ●選択した容量データの取得
			// 削減容量タイプBean
			X31SDataBeanAccess addCapaBean = serviceFormBean.getDataBeanArray(FUW11401SFConst.DSL_CAPA_LIST).getDataBean(0);
			// 選択値取得
			int selectValue = addCapaBean.sendMessageLong(FUW11401SFConst.SELECT_VALUE_01, X31CWebConst.DATABEAN_GET_VALUE, 0).intValue();
			// 削減後合計容量取得
			String gokei_capa = addCapaBean.sendMessageString(FUW11401SFConst.GOKEI_CAPA_01, X31CWebConst.DATABEAN_GET_VALUE, selectValue);
			// 削減後合計容量設定
			serviceFormBean.sendMessageString(FUW11401SFConst.GOKEI_CAPA, X31CWebConst.DATABEAN_SET_VALUE, gokei_capa);
			// お申し込みWeb容量
			String addCapa = addCapaBean.sendMessageString(FUW11401SFConst.ADD_CAPA_01, X31CWebConst.DATABEAN_GET_VALUE, selectValue);
			serviceFormBean.sendMessageString(FUW11401SFConst.MSKM_WEB_CAPA, X31CWebConst.DATABEAN_SET_VALUE, addCapa);
			// 無料容量
			int muryoCapa = serviceFormBean.sendMessageLong(FUW11401SFConst.MRYO_CAPA, X31CWebConst.DATABEAN_GET_VALUE).intValue();
			// 変更後の追加したＷｅｂ契約容量の合計（保存用）
			int addCapaTotalAfter = Integer.valueOf(gokei_capa) - muryoCapa;
			if (addCapaTotalAfter < 0)
			{
				addCapaTotalAfter = 0;
			}
			serviceFormBean.sendMessageLong(FUW11401SFConst.ADD_CAPA_TOTAL_AFTER, X31CWebConst.DATABEAN_SET_VALUE, Long.valueOf(addCapaTotalAfter));

		}

		// ●サービス呼び出し処理
		// リモートサポートプラス申込（初期表示）サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0288);

		FUSV0288_FUSV0288OPDBMapper mapper = new FUSV0288_FUSV0288OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// ホームページURL名取得申込（初期表示）サービスの呼び出しを行う。
		X31SDataBeanAccess[] paramBean = { serviceFormBean, ssoInfoBean, svcKeiInfoBean, opSvcKeiInfoBean, sbopSvcKeiInfoBean };

		// 1.ネットオプションサービス契約取得CC(FUSV028901CC)
		dataMap = mapper.setFUSV028802CC_HP(paramBean, dataMap, funcCd);

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		try
		{
			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 関連チェックを行う
			handleMskmException(se);
		}

		// 機能コードが「1」の場合
		if (JPCModelConstant.FUNC_CD_1.equals(funcCd))
		{
			// 申込完了メール送信部品呼出処理
			JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW114_1);
		}

	}

	/**
	 * 削減申し込み時例外ハンドリング処理
	 * <br/>
	 * 削減処理時に発生した業務例外のハンドリングを行ないます。
	 *
	 * @param jwse 申込処理時に発生したJCCWebServiceExceptionオブジェクト
	 */
	private void handleMskmException(JCCWebServiceException jwse)
	{
		// 例外情報を取得
		X31CMessageResult msgResult = jwse.getMessageList();
		X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
		// 関連チェック系は必ずエラーが1つのため0番目から取得する。
		X31CMessageMoreInfo info = moreInfo[0];
		String itemid = info.getItemId();
		String status = info.getStatus();
		String errFlg = info.getItemCheckErr();

		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{
			// エラーフラグが"EA"の場合
			if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg))
			{
				// -------------------------------------------------
				// ■タイムスタンプチェック
				// -------------------------------------------------
				// "EA"かつアイテムが"更新年月日時分秒(更新前)"の場合
				if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemid))
				{
					// 更新不可エラー(0204)
					DEBUG_LOG.info("■■■ 更新不可エラー(0204)");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0204);
				}
			}
		}

		// システムエラー(0002)
		DEBUG_LOG.info("■■■ システムエラー(0002)");
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
	}

	/**
	 * 削減容量リストを作成します。
	 * <br>
	 * @param serviceFormBean Web契約容量削減申込サービスフォームBean
	 * @throws Exception
	 */
	private void createOptioinData(X31SDataBeanAccess serviceFormBean) throws Exception
	{

		// 現在のWeb契約容量
		int nowWebKeiCapaValue =
				Long.valueOf(serviceFormBean.sendMessageString(FUW11401SFConst.NOW_WEB_KEI_CAPA, X31CWebConst.DATABEAN_GET_VALUE)).intValue();
		// 削減可能Web契約容量
		int dslPsbWebKeiCapaValue =
				Long.valueOf(serviceFormBean.sendMessageString(FUW11401SFConst.DSL_PSB_WEB_KEI_CAPA, X31CWebConst.DATABEAN_GET_VALUE)).intValue();

		// 削減容量リストのインデックス初期化
		int idx = 0;

		// 削減容量リスト初期化
		X31SDataBeanAccessArray dslCapaListArray = serviceFormBean.getDataBeanArray(FUW11401SFConst.DSL_CAPA_LIST);
		dslCapaListArray.clearArray();

		X31SDataBeanAccess addCapaListDataType = dslCapaListArray.addDataBean();

		while (true)
		{
			// 申込容量
			int dslCapa = WEB_CAPA_DSL_UNIT_MB * idx;

			// 削減可能Web契約容量と申込容量を比較
			if ((dslPsbWebKeiCapaValue < dslCapa))
			{
				// 削減可能Web契約容量より大きい場合、リスト作成終了
				break;
			}

			// 削減後契約容量
			int goukeiCapa = nowWebKeiCapaValue - dslCapa;

			// 削減容量
			addCapaListDataType.sendMessageString(FUW11401SFConst.SELECT_VALUE_01, X31CWebConst.DATABEAN_ADD_VALUE, dslCapa);

			// 削減容量（表示用）
			String dslCapaText = JFUWebCommon.formatNumber(String.valueOf(dslCapa)) + UNIT_MB;
			if (dslCapa == 0) {
				dslCapaText = SEL_MONGON;
			}
			addCapaListDataType.sendMessageString(FUW11401SFConst.ADD_CAPA_01, X31CWebConst.DATABEAN_ADD_VALUE, dslCapaText);

			// 削減後合計容量
			addCapaListDataType.sendMessageString(FUW11401SFConst.GOKEI_CAPA_01, X31CWebConst.DATABEAN_ADD_VALUE, String.valueOf(goukeiCapa));

			idx++;
		}
	}

	/**
	 * 共有フォームBeanの情報を取得します。 <BR>
	 * 
	 * @param commoninfoBean
	 * @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 ssoInfoWebid = ssoInfoBean.sendMessageString(CommonInfoCFConst.WEB_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);

			// オプションサービスコード
			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);

			if (!JFUStrConst.CD00136_B002.equals(opSvCd))
			{
				// "B002"Myホームページ以外の場合
				continue;
			}

			if (JFUStrConst.CD00037_910.equals(opSvcKeiStat) || JFUStrConst.CD00037_920.equals(opSvcKeiStat))
			{
				// 「910:解約済み」の場合、または、「920:キャンセル済」の場合
				continue;
			}

			// オプションサービス契約情報（確定）
			opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;

			break;
		}

		if (opSvcKeiInfoBean == null)
		{
			// "B002"Myホームページのオプションサービスが存在しない場合
			// 契約状態エラー(0102)
			DEBUG_LOG.info("■■■ 契約状態エラー(0131)");
			// 契約状態エラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0131);
		}

		// ホームページアドレス確認処理
		// 共有フォームBean.オプションサービス契約情報.ＵＲＬ（ドメイン）または
		// 共有フォームBean.オプションサービス契約情報.ＵＲＬ（アカウント）がNULLの場合
		if (JFUWebCommon.isNull(opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.URL_DOMAIN_28, X31CWebConst.DATABEAN_GET_VALUE))
				|| JFUWebCommon.isNull(opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.URL_ACCOUNT_28, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// 削減対象オプションURL未取得エラー(0134)
			DEBUG_LOG.info("■■■ 削減対象オプションURL未取得エラー(0134)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0134);
		}

		// ○サブオプションの契約の確認
		// サブオプションサービス契約情報
		X31SDataBeanAccess sbopSvcKeiInfoBean = null;

		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 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;
				}

				// オプションサービス契約番号 = オプションサービス契約情報.オプションサービス契約番号 且つ
				// "D04"ホームページ容量追加の場合
				if (opInfoOpSvcKeiNo.equals(opSvcKeiNo) && JFUStrConst.CD00137_D04.equals(sbopSvCd))
				{
					// サブオプションサービス契約情報（確定）
					sbopSvcKeiInfoBean = tmpSbopSvcKeiInfoBean;

				}
			}
		}

		if (sbopSvcKeiInfoBean == null)
		{
			// 解約対象オプション未契約エラー(0135)
			DEBUG_LOG.info("■■■ 解約対象オプション未契約エラー(0135)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0135);
		}

		// ☆☆マップにセット☆
		resultMap.put(CommonInfoCFConst.SYSID_21, ssoInfoSysid);
		resultMap.put(CommonInfoCFConst.WEB_ID_21, ssoInfoWebid);
		// 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.OP_SVC_KEI_INFO, opSvcKeiInfoBean); // オプションサービス契約情報
		resultMap.put(CommonInfoCFConst.SBOP_SVC_KEI_INFO, sbopSvcKeiInfoBean); // サブオプションサービス契約情報

		return resultMap;
	}

}
