/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：FUW11301SFLogic
 *  ソースファイル名：FUW11301SFLogic.java
 *  作成者          ：富士通
 *  日付            ：2011年05月01日
 *＜機能概要＞
 *  メールウィルスチェック解約申込のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v14.00.00   2015/02/01   FJ）谷本    【ANK-1688-00-00】
 *	 v32.00		 2017/04/13   FJ) 横山    【ANK-3149-00-00】新セキュリティパック導入
 *   v37.00      2018/02/16   FJ) 美濃原  【ANK-3366-00-00】eo光設備卸対応
 *   v73.00      2024/07/30   FJ)浅井     【ANK-4427-00-00】NTT卸対応
 **********************************************************************/
package eo.web.webview.FUW11301SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.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.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0288_FUSV0288OPDBMapper;
import eo.web.webview.mapping.FUSV0289_FUSV0289OPDBMapper;

/**
 * メールウィルスチェック解約申込のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings({"serial", "unchecked"})
public class FUW11301SFLogic extends JCCWebBusinessLogic
{

	/** 画面ID */
	private static final String FUW11301 = "FUW11301";

	/** DataBean操作種別：項目値設定 */
	private static final String SET = X31CWebConst.DATABEAN_SET_VALUE;
	/** DataBean操作種別：項目値取得 */
	private static final String GET = X31CWebConst.DATABEAN_GET_VALUE;

	/** サービスID */
	private static final String USECASE_ID_FUSV0289 = "FUSV0289";
	/** サービスID */
	private static final String USECASE_ID_FUSV0288 = "FUSV0288";

	/** エラー処理:EKK1681B001 */
	private static final String EKK1681B001 = "EKK1681B001";
	/** エラー処理:EKK0361D010 */
	private static final String EKK0361D010 = "EKK0361D010";
	/** エラー処理:key_ido_div */
	private static final String KEY_IDO_DIV = "key_ido_div";
	/** エラー処理:upd_dtm_bf */
	private static final String UPD_DTM_BF = "upd_dtm_bf";

	/** 料金プラン固定単価（オプション申込料金）一覧照会 */
	private static final String SC_TITLE_FUSV028901 = "FUSV028901SC";
	/** 料金プラン固定金額 */
	private static final String PPLAN_KOTEI_AMNT = "pplan_kotei_amnt";
	/** 料金プラン固定単位コード名 */
	private static final String PPLAN_KOTEI_TANI_CD_NM = "pplan_kotei_tani_cd_nm";

	/** EKK0601B001CBSMsg1List */
	private static final String EKK0601B001CBSMSG1LIST = "EKK0601B001CBSMsg1List";
	/** FUSV028901CC */
	private static final String FUSV028901CC = "FUSV028901CC";
	/** EKK0351B503CBSMsg1List */
	private static final String EKK0351B503CBSMSG1LIST = "EKK0351B503CBSMsg1List";
	/** out_op_info_list */
	private static final String OUT_OP_INFO_LIST = "out_op_info_list";

	/** 申込完了メールID */
	private static final String MSKM_COMP_MAIL_ID = "FUW113_1";

	/** 件数:1件 */
	private static final String CNT_ONE = "1";

	/** 有効な会員種別 */
	private static final List<String> MEMBER_SBT_CD_YUKO = Arrays.asList(JFUStrConst.CD00039_10, JFUStrConst.CD00039_20);

	/** [料金情報]プロパティファイル取得クエリ */
	private static final String QUERY_DISPTEXT_PATH = "DISPSETTING/SETTING[@screenId='FUW11301']/DISPTEXT[@groupid='PRICE']";
	/** [料金情報]プロパティファイル取得属性名 */
	private static final String QUERY_ATTR_NAME = "id";
	/** [料金情報]単位 */
	private static final String TANI = "TANI";
	/** [料金情報]無料文言 */
	private static final String MURYO_TEXT = "MURYO_TEXT";

	/** サービスIF返値：ファミリーパック申込有無 */
	private static final String FAMIPA_MSKM_UMU = "famipa_mskm_umu";
	/** サービスIF返値：料金固定単価 */
	private static final String KOTEI_AMNT = "pplan_kotei_amnt";
	/** サービスIF返値：最終更新年月日時分秒 */
	private static final String LAST_UPD_DTM = "last_upd_dtm";
	/** サービスIF返値：メンバー種別コード */
	private static final String MEMBER_SBT_CD = "member_sbt_cd";
	/** サービスIF返値：メールアドレス */
	private static final String MLAD = "mlad";
	/** サービスIF返値：オプションサービス契約番号 */
	private static final String OP_SVC_KEI_NO = "op_svc_kei_no";
	/** サービスIF返値：整理番号 */
	private static final String SEIRI_NO = "seiri_no";
	/** サービスIF返値：サービス契約番号 */
	private static final String SVC_KEI_NO = "svc_kei_no";
	/** サービスIF返値：サービス契約名 */
	private static final String SVC_KEI_NM = "svc_kei_nm";
	/** サービスIF返値：サービス提供物無料値 */
	private static final String SVCTK_BUT_MRYO_VALUE = "svctk_but_mryo_value";
	/** サービスIF返値：SYSID */
	private static final String SYSID = "sysid";
	/** サービスIF返値：料金グループコード */
	private static final String PRC_GRP_CD = "prc_grp_cd";

// ANK-4427-00-00 ADD START
	/** サービスIF返値：NTT卸区分 */
	private static final String NTTORS_DIV = "nttors_div";
// ANK-4427-00-00 ADD END

	/** 2017/04/13 ANK-3149-00-00 add start */
	/** サービスIF返値：セキュリティパック申込有無 */
	private static final String SECPA_MSKM_UMU = "secpa_mskm_umu";
	/** サービスIF返値：プレミアムパック申込有無 */
	private static final String PREPA_MSKM_UMU = "prepa_mskm_umu";
	/** 2017/04/13 ANK-3149-00-00 add end */

	/** [サービス契約名]プロパティファイル取得クエリ */
	private static final String QUERY_DISPTEXT_PATH_SVC_KEI_NM = "DISPSETTING/SETTING[@screenId='FUW11301']/DISPTEXT[@groupid='SVC_KEI_NM']";
	/** [サービス契約名]プロパティファイル取得属性名 */
	private static final String QUERY_ATTR_NAME_SVC_KEI_NM = "id";

	/** 2017/04/17 ANK-3149-00-00 add start */
	/** 定数：パック契約中文言の表示パターン：プレミアムパック契約中 */
	private static final String PREPA_KYK = "1";
	/** 定数：パック契約中文言の表示パターン：セキュリティパック契約中 */
	private static final String SECPA_KYK = "2";
	/** 定数：パック契約中文言の表示パターン：ファミリーパック契約中 */
	private static final String FAMIPA_KYK = "3";
	/** 定数：パック契約中文言の表示パターン：パック契約なし */
	private static final String PAC_KYK_NS = "4";
	/** 2017/04/17 ANK-3149-00-00 add end */

	/**
	 * 初期処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{
		DEBUG_LOG.info("----- init Start -----");

		// ■設備卸チェック
		JFUWebCommon.checkOrosi(this);

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより現顧客契約情報を取得する。
		Map<String, Object> resultMap = getCommoninfoBeanInfo(commoninfoBean, null);

		// SSOのBeanを取得
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SSO_INFO);

		// ---- サービスフォームbean ----
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 各Beanを配列に格納
		X31SDataBeanAccess[] beanArray = { bean, ssoInfoBean };

		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0289);

		FUSV0289_FUSV0289OPDBMapper mapper = new FUSV0289_FUSV0289OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// ●上りマッピング
		// ネットオプションサービス契約取得CC(メールウィルスチェック)
		mapper.setFUSV028901CC_VC(beanArray, dataMap, JPCModelConstant.FUNC_CD_1);

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// ●サービスの呼び出しを行う。
		try
		{
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			chkRelationServiceError(se);
		}

		// ●下りデータ取得
		HashMap parentMap = (HashMap)outputMap.get(FUSV028901CC);
		ArrayList<HashMap> opInfoList = (ArrayList)parentMap.get(OUT_OP_INFO_LIST);

		// ●会員種別チェック
		String memberStbCd = (String)parentMap.get(MEMBER_SBT_CD);
		// 有効な会員種別以外の場合
		if (!MEMBER_SBT_CD_YUKO.contains(memberStbCd))
		{
			// 会員種別エラー(0130)
			DEBUG_LOG.info("■■■会員種別エラー(0130)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0130);
		}

		// ●契約状態エラー判定
		// データがない場合
		if (opInfoList.size() == 0)
		{
			// 解約対象オプション未契約エラー(0131)
			DEBUG_LOG.info("■■■解約対象オプション未契約エラー(0131)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0131);
		}

		// ●サービス契約名(料金プランから取れない名称を取得）
		Map<String, String> dispDefMap = JFUWebCommon.getDispItemsAsMap(QUERY_DISPTEXT_PATH_SVC_KEI_NM, QUERY_ATTR_NAME_SVC_KEI_NM);

		// ●サービスBean設定(下りマッピング)
		X31SDataBeanAccessArray svcKeiArray = bean.getDataBeanArray(FUW11301SFConst.SVC_KEI_LIST);
		// 前回サービス契約番号
		String befSvcKeiNo = JFUStrConst.EMPTY;
		// サービス契約リスト
		for (HashMap opInfoMap : opInfoList)
		{

			// オプションデータ取得
			ArrayList<HashMap> detailList = (ArrayList)opInfoMap.get(EKK0351B503CBSMSG1LIST);

			// 今回サービス契約番号
			String curSvcKeiNo = (String)opInfoMap.get(SVC_KEI_NO);

			for (HashMap detailMap : detailList)
			{

				// サービス契約番号が前回値と異なる場合は、ビーンを追加、同じ場合は、前のビーンを使用する。
				X31SDataBeanAccess svcKeiBean = null;
				if (!befSvcKeiNo.equals(curSvcKeiNo))
				{
					// ビーンに追加
					svcKeiBean = svcKeiArray.addDataBean();
					// SYSID
					svcKeiBean.sendMessageString(FUW11301SFConst.SYSID_01, SET, (String)opInfoMap.get(SYSID));
					// サービス契約番号
					svcKeiBean.sendMessageString(FUW11301SFConst.SVC_KEI_NO_01, SET, curSvcKeiNo);
					// 整理番号
					svcKeiBean.sendMessageString(FUW11301SFConst.SEIRI_NO_01, SET, (String)opInfoMap.get(SEIRI_NO));
					// 最終更新年月日時分秒
					svcKeiBean.sendMessageString(FUW11301SFConst.LAST_UPD_DTM_01, SET, (String)opInfoMap.get(LAST_UPD_DTM));
					// サービス契約名
					String svcKeiNm = (String)opInfoMap.get(SVC_KEI_NM);
					// 料金グループコードが、08:ｅｏモバイル（３Ｇ）、09:ｅｏモバイル（ＵＱ−ＷｉＭＡＸ）
					String prcGrpCd = (String)opInfoMap.get(PRC_GRP_CD);
					if (JFUWebCommon.isNull(svcKeiNm) && (JFUStrConst.CD00133_08.equals(prcGrpCd) || JFUStrConst.CD00133_09.equals(prcGrpCd)))
					{
						svcKeiNm = dispDefMap.get(prcGrpCd);
					}
					
					/** 2017/04/13 ANK-3149-00-00 mod start */
					svcKeiBean.sendMessageString(FUW11301SFConst.SVC_KEI_NM_01, SET, svcKeiNm);
					// パック契約フラグ
					boolean packKeiFlg = false;
					// ファミリーパック契約フラグ
					boolean famipaKeiFlg = false;
					// セキュリティーパック契約フラグ
					boolean secpaKeiFlg = false;
					// プレミアムパック契約フラグ
					boolean prepaKeiFlg = false;
					// ファミリーパック有無確認
					if (JFUStrConst.CD00002_1.equals((String)opInfoMap.get(FAMIPA_MSKM_UMU)))
					{
						packKeiFlg = true;
						famipaKeiFlg = true;
					}
					// セキュリティーパック有無確認
					if (JFUStrConst.CD00002_1.equals((String)opInfoMap.get(SECPA_MSKM_UMU)))
					{
						packKeiFlg = true;
						secpaKeiFlg = true;
					}
					// プレミアムパック有無確認
					if (JFUStrConst.CD00002_1.equals((String)opInfoMap.get(PREPA_MSKM_UMU)))
					{
						packKeiFlg = true;
						prepaKeiFlg = true;
					}
					// パック契約フラグセット
					svcKeiBean.sendMessageBoolean(FUW11301SFConst.PACK_KEI_FLG_01, SET, packKeiFlg);
					// ファミリーパック契約フラグセット
					svcKeiBean.sendMessageBoolean(FUW11301SFConst.FAMIPA_KEI_FLG_01, SET, famipaKeiFlg);
					// セキュリティーパック契約フラグセット
					svcKeiBean.sendMessageBoolean(FUW11301SFConst.SECPA_KEI_FLG_01, SET, secpaKeiFlg);
					// プレミアムパック契約フラグセット
					svcKeiBean.sendMessageBoolean(FUW11301SFConst.PREPA_KEI_FLG_01, SET, prepaKeiFlg);
					// パック文言パターン 初期値：パック契約なし
					String packMngnPtn = PAC_KYK_NS;
					if (prepaKeiFlg)
					{
						packMngnPtn = PREPA_KYK;
					}
					else if (secpaKeiFlg)
					{
						packMngnPtn = SECPA_KYK;
					}
					else if (famipaKeiFlg)
					{
						packMngnPtn = FAMIPA_KYK;
					}
					// パック契約フラグセット
					svcKeiBean.sendMessageString(FUW11301SFConst.PACK_KEI_MNGN_DSP_PTN_01, SET, packMngnPtn);
					/** 2017/04/13 ANK-3149-00-00 mod end */
					// メールウィルスチェック契約数
					svcKeiBean.sendMessageString(FUW11301SFConst.VC_KEI_CNT_01, SET, String.valueOf(detailList.size()));
					// メールウィルスチェック無料数
					svcKeiBean.sendMessageString(FUW11301SFConst.VC_MRYO_CNT_01, SET, (String)detailMap.get(SVCTK_BUT_MRYO_VALUE));
					// メールウィルスチェック料金
					svcKeiBean.sendMessageString(FUW11301SFConst.VC_PRICE_01, SET, (String)detailMap.get(KOTEI_AMNT));

// ANK-4427-00-00 ADD START
					// ＮＴＴ卸区分
					String nttorsDiv = (String)opInfoMap.get(NTTORS_DIV);
					svcKeiBean.sendMessageString(FUW11301SFConst.NTTORS_DIV_01, SET, nttorsDiv);
// ANK-4427-00-00 ADD END

				}
				else
				{
					svcKeiBean = svcKeiArray.getDataBean(svcKeiArray.getCount() - 1);
				}

				// 解約オプションリスト
				X31SDataBeanAccessArray dslOptionArray = svcKeiBean.getDataBeanArray(FUW11301SFConst.DSL_OPTION_LIST);
				// ビーンに追加
				X31SDataBeanAccess dslOptionBean = dslOptionArray.addDataBean();

				// オプションサービス契約番号
				dslOptionBean.sendMessageString(FUW11301SFConst.OP_SVC_KEI_NO_02, SET, (String)detailMap.get(OP_SVC_KEI_NO));
				// メールアドレス
				dslOptionBean.sendMessageString(FUW11301SFConst.MLAD_02, SET, (String)detailMap.get(MLAD));
				// 解約する
				dslOptionBean.sendMessageBoolean(FUW11301SFConst.DSL_02, SET, false);

				// 前回サービス契約番号
				befSvcKeiNo = (String)opInfoMap.get(SVC_KEI_NO);
			}

		}

		// ●解約可能フラグの設定
		// 　サービス契約単位で、メールウィルスチェック数が2件以上且つ当日申込フラグがfalseのデータがあれば
		// 　申込可能になる。（※画面の解約するチェックが１つでも押下できる場合）
		boolean dslFlag = false;
		X31SDataBeanAccessArray svcKeiArray2 = bean.getDataBeanArray(FUW11301SFConst.SVC_KEI_LIST);
		for (int m = 0; m < svcKeiArray2.getCount(); m++)
		{
			X31SDataBeanAccess svcKeiBean = svcKeiArray2.getDataBean(m);

			/** 2017/04/17 ANK-3149-00-00 mod start */
			// パック契約フラグ＝TRUEの場合スキップ
			if (svcKeiBean.sendMessageBoolean(FUW11301SFConst.PACK_KEI_FLG_01, GET))
			{
				/** 2017/04/17 ANK-3149-00-00 mod end */
				continue;
			}
			dslFlag = true;
		}
		bean.sendMessageBoolean(FUW11301SFConst.DSL_ENABLED_FLG, SET, dslFlag);

		// ●料金表データ設定
		setPriceData(bean);

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUWebCommon.getScreenId(this));
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW11301);

		DEBUG_LOG.info("----- init End -----");
		return true;
	}

	/**
	 * 申込画面の確認ボタン押下時の処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean cfm() throws Exception
	{
		DEBUG_LOG.info("----- cfm Start -----");

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより現顧客契約情報を取得する。
		Map<String, Object> resultMap = getCommoninfoBeanInfo(commoninfoBean, null);

		// 各Beanを取得
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SSO_INFO);

		// ---- サービスフォームbean ----
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// ●解約申込フラグの設定
		// 　サービス契約単位で、オプションの解約があればtrueを設定
		X31SDataBeanAccessArray svcKeiArray2 = bean.getDataBeanArray(FUW11301SFConst.SVC_KEI_LIST);
		for (int m = 0; m < svcKeiArray2.getCount(); m++)
		{
			boolean dslMskmFlag = false;

			X31SDataBeanAccess svcKeiBean = svcKeiArray2.getDataBean(m);

			// 解約オプションリスト
			X31SDataBeanAccessArray dslOptionArray = svcKeiBean.getDataBeanArray(FUW11301SFConst.DSL_OPTION_LIST);
			for (int n = 0; n < dslOptionArray.getCount(); n++)
			{
				X31SDataBeanAccess dslOptioBean = dslOptionArray.getDataBean(n);
				// オプションの解約申込があれば、解約申込フラグをtrueにする
				if (dslOptioBean.sendMessageBoolean(FUW11301SFConst.DSL_02, GET))
				{
					dslMskmFlag = true;
				}
			}

			// 解約申込フラグの設定
			svcKeiBean.sendMessageBoolean(FUW11301SFConst.DSL_MSKM_FLG_01, SET, dslMskmFlag);
		}

		// 各Bean情報を配列に格納
		X31SDataBeanAccess[] beanArray = { bean, ssoInfoBean };

		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0288);

		FUSV0288_FUSV0288OPDBMapper mapper = new FUSV0288_FUSV0288OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// ●上りマッピング
		// オプトインメール受信設定登録CC
		mapper.setFUSV028801CC(beanArray, dataMap, JPCModelConstant.FUNC_CD_1);
		// ネットオプションサービス契約解約CC
		mapper.setFUSV028802CC_VC(beanArray, dataMap, JPCModelConstant.FUNC_CD_2);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

		// ●サービス呼び出し
		try
		{
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			chkRelationServiceError(se);
		}

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW11302);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW11302);

		DEBUG_LOG.info("----- cfm End -----");
		return true;
	}

	/**
	 * 確認画面の解約するボタン押下時の処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean dsl() throws Exception
	{
		DEBUG_LOG.info("----- dsl Start -----");

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより現顧客契約情報を取得する。
		Map<String, Object> resultMap = getCommoninfoBeanInfo(commoninfoBean, null);

		// 各Beanを取得
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SSO_INFO);

		// ---- サービスフォームbean ----
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 各Bean情報を配列に格納
		X31SDataBeanAccess[] beanArray = { bean, ssoInfoBean };

		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0288);

		FUSV0288_FUSV0288OPDBMapper mapper = new FUSV0288_FUSV0288OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// ●上りマッピング
		// オプトインメール受信設定登録CC
		mapper.setFUSV028801CC(beanArray, dataMap, JPCModelConstant.FUNC_CD_2);
		// ネットオプションサービス契約解約CC
		mapper.setFUSV028802CC_VC(beanArray, dataMap, JPCModelConstant.FUNC_CD_1);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

		// サービス契約ステータスを設定
		JFUWebCommon.setSvcKeiStat(this, dataMap);

		// ●サービス呼び出し
		try
		{
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			chkRelationServiceError(se);
		}

		// ●完了メール
		X31SDataBeanAccessArray svcKeiArray = bean.getDataBeanArray(FUW11301SFConst.SVC_KEI_LIST);
		for (int m = 0; m < svcKeiArray.getCount(); m++)
		{
			X31SDataBeanAccess svcKeiBean = svcKeiArray.getDataBean(m);

			// 解約申込フラグがfalseの場合スキップ
			if (!svcKeiBean.sendMessageBoolean(FUW11301SFConst.DSL_MSKM_FLG_01, GET))
			{
				continue;
			}

			// 整理番号
			JFUWebCommon.setDataBeanItemByPath(commoninfoBean, JFUWebCommon.SVC_KEI_INFO + JFUWebCommon.SEP_0 + CommonInfoCFConst.SEIRI_NO_23,
					svcKeiBean.sendMessageString(FUW11301SFConst.SEIRI_NO_01, GET));
			// SYSID
			JFUWebCommon.setDataBeanItemByPath(commoninfoBean, JFUWebCommon.SSO_INFO + JFUWebCommon.SEP_0 + CommonInfoCFConst.SYSID_21, svcKeiBean
					.sendMessageString(FUW11301SFConst.SYSID_01, GET));

			// 申込完了メール送信部品呼出処理
			JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID);
		}

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW11303);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW11303);

		DEBUG_LOG.info("----- dsl End -----");
		return true;
	}

	/**
	 * 確認画面の戻るボタン押下時の処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean back() throws Exception
	{
		DEBUG_LOG.info("----- back Start -----");

		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW11301);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW11301);

		DEBUG_LOG.info("----- back End -----");
		return true;
	}

	/**
	 * 料金表データを設定します。
	 * 
	 * @param bean
	 * @throws Exception
	 */
	private void setPriceData(X31SDataBeanAccess bean) throws Exception
	{

		// ●料金表データ作成
		int vcPriceSum = 0;
		X31SDataBeanAccessArray svcKeiArray3 = bean.getDataBeanArray(FUW11301SFConst.SVC_KEI_LIST);
		for (int m = 0; m < svcKeiArray3.getCount(); m++)
		{
			X31SDataBeanAccess svcKeiBean = svcKeiArray3.getDataBean(m);
			// メールウィルスチェック契約数
			int vcKeiCnt = Integer.valueOf(svcKeiBean.sendMessageString(FUW11301SFConst.VC_KEI_CNT_01, GET)).intValue();
			// メールウィルスチェック無料数
			int vcMryoCnt = Integer.valueOf(svcKeiBean.sendMessageString(FUW11301SFConst.VC_MRYO_CNT_01, GET)).intValue();
			// メールウィルスチェック料金
			int vcPrice = Integer.valueOf(svcKeiBean.sendMessageString(FUW11301SFConst.VC_PRICE_01, GET)).intValue();
			/** 2017/04/17 ANK-3149-00-00 mod start */
			// パック契約フラグ
			boolean packKeiFlg = svcKeiBean.sendMessageBoolean(FUW11301SFConst.PACK_KEI_FLG_01, GET);

			// パック契約中 または、契約数-無料数が0以下の場合は、スキップ
			if (packKeiFlg || (vcKeiCnt - vcMryoCnt <= 0))
			{
				/** 2017/04/17 ANK-3149-00-00 mod end */
				continue;
			}

			vcPriceSum = vcPriceSum + (vcKeiCnt - vcMryoCnt) * vcPrice;

		}

		// ◆ 0円以上の場合、金額を設定する。
		// 料金表情報取得
		Map<String, String> dispDefMap = JFUWebCommon.getDispItemsAsMap(QUERY_DISPTEXT_PATH, QUERY_ATTR_NAME);
		String vcPriceTaniText = JFUStrConst.EMPTY;
		String vcPriceSumText = dispDefMap.get(MURYO_TEXT);
		if (vcPriceSum > 0)
		{
			vcPriceSumText = String.valueOf(vcPriceSum);
			vcPriceTaniText = dispDefMap.get(TANI);
		}

		// 料金表データ作成（後続のJFUWebCommon.setPrcInfoArea()メソッドで使用）
		List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
		Map<String, Object> childMap = new HashMap<String, Object>();
		childMap.put(PPLAN_KOTEI_TANI_CD_NM, vcPriceTaniText);
		childMap.put(PPLAN_KOTEI_AMNT, vcPriceSumText);
		dataList.add(childMap);

		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		dataMap.put(EKK0601B001CBSMSG1LIST, dataList);

		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		outputMap.put(SC_TITLE_FUSV028901, dataMap);

		// ●解約後オプション料金を設定
		bean.sendMessageString(FUW11301SFConst.DSL_VC_PRICE, SET, vcPriceSumText);

		// ●料金表マッピング
		JFUWebCommon.setPrcInfoArea(bean, outputMap, SC_TITLE_FUSV028901, null, FUW11301);

		// 料金表表示現在日設定処理
		JFUWebCommon.setPrcDspNowDay(this);
	}

	/**
	 * 共有フォームBeanの情報を取得します。
	 * 
	 * @param commoninfoBean
	 * @param fixMlad
	 * @return 取得した情報を保持したマップ
	 */
	private Map<String, Object> getCommoninfoBeanInfo(X31SDataBeanAccess commoninfoBean, String fixMlad)
	{
		// 結果マップ
		Map<String, Object> resultMap = new HashMap<String, Object>();

		// 共通フォームBean/ＷＥＢ変更情報/0/ＳＳＯ情報/0
		X31SDataBeanAccess ssoInfoBean = JFUWebCommon.getDataBeanTypeByPath(commoninfoBean, JFUWebCommon.SSO_INFO);

		// 各Bean情報
		resultMap.put(CommonInfoCFConst.SSO_INFO, ssoInfoBean);

		return resultMap;
	}

	/**
	 * サービス処理結果の例外判定をします。
	 * 
	 * @param se
	 */
	private void chkRelationServiceError(JCCWebServiceException se)
	{
		// 例外情報を取得
		X31CMessageResult msgResult = se.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))
		{
			// 予約チェック
			if (EKK1681B001.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && KEY_IDO_DIV.equals(itemid))
			{
				// 解約対象オプション未来予約エラー(0132)
				DEBUG_LOG.info("■■■解約対象オプション未来予約エラー(0132)");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0132);
			}

			// タイムスタンプチェック：指定された「サービス契約」がすでに更新されている場合、エラー
			else 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);
	}
}