/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：FUW02501SFLogic
 *   ソースファイル名：FUW02501SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2011年05月31日
 *＜機能概要＞
 *   ホームページアクセス分析サービス申込のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/05/31   FJ）山本    新規作成
 *   v3.00.00    2012/03/27   FJ) 南岡    【ANK-0041-00-00】 申込完了メール対応
 *   v3.00.00    2012/04/14   FJ) 山名    【ST2-2012-0000633】 /~対応
 *   v4.00       2012/06/12   FJ）中谷    【ANK-1163-00-00】｢変更系申込が可能となるタイミングについて｣対応
 *   v4.00       2012/09/26   FJ) 岡井    【ANK-1198-00-00】変更系申込画面の提供条件・利用規約の設置位置について
 *   v8.00       2014/01/27   FJ) 文元    【ANK-1589-00-00】消費増税に伴う料金施策
 *
 **********************************************************************/
package eo.web.webview.FUW02501SF;

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.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.FUSV0069_FUSV0069OPDBMapper;
import eo.web.webview.mapping.FUSV0070_FUSV0070OPDBMapper;

/**
 * ホームページアクセス分析サービス申込のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW02501SFLogic extends JCCWebBusinessLogic
{
	/** サブオプションサービス契約<ISP>登録 */
	private static final String EKK0411D010 = "EKK0411D010";

	/** オプションサービス契約番号 */
	private static final String OP_SVC_KEI_NO = "op_svc_kei_no";

	/** サービスID：ホームページアクセス分析サービス申込(初期表示) */
	private static final String USECASE_ID_FUSV0069 = "FUSV0069";
	/** サービスID：ホームページアクセス分析サービス申込(申込) */
	private static final String USECASE_ID_FUSV0070 = "FUSV0070";

	/** 料金プラン固定単価（オプション申込料金）一覧照会SC */
	private static final String SC_TITLE_FUSV006902 = "FUSV006902SC";
	/** 初期費用一覧照会CC */
	private static final String CC_TITLE_FUSV006901 = "FUSV006901CC";

	/** 料金プラン固定単価（オプション申込料金）一覧照会SC */
	private static final String EKK0601B001_LIST = "EKK0601B001CBSMsg1List";
	/** 初期費用一覧照会CC */
	private static final String EKK0721A010_LIST = "EKK0721A010CBSMsg1List";

	/** 更新年月日時分秒(更新前) */
	private static final String UPD_DTM_BF = "upd_dtm_bf";
	/** サブオプションサービス契約数*/
	private static final String SBOP_SVC_KEI_CNT = "sbop_svc_kei_cnt";
	/** 料金プラン固定単価*/
	private static final String PPLAN_KOTEI_AMNT = "pplan_kotei_amnt";

	/** 申込完了メールID */
	private static final String MSKM_COMP_MAIL_ID = "FUW025_1";

	/**
	 * ホームページアクセス分析サービス申込画面の初期処理を行います。
	 * 
	 * @return 処理結果（必ずtrue）
	 * @throws Exception 例外出力
	 */
	public boolean init() 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);

		// サブオプションサービス契約数
		int sbopSvcKeiCnt = ((Integer)resultMap.get(SBOP_SVC_KEI_CNT)).intValue();

		// -- サービスデータのチェック --
		checkSvcData(resultMap);

		// ---- サービスフォーム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_FUSV0069);

		FUSV0069_FUSV0069OPDBMapper mapper = new FUSV0069_FUSV0069OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = { bean, svcKeiInfoBean };

		// 1.業務パラメータ管理一意照会SC（MYホームページURLのプロトコルを取得）
		mapper.setFUSV006901SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 2.料金プラン固定単価（オプション申込料金）一覧照会SC
		mapper.setFUSV006902SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 3.料金コース_サブオプションサービス一意照会SC(最大サブオプションサービス契約数を取得)
		mapper.setFUSV006903SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// 初期費用一覧照会CC
		mapper.setFUSV006901CC(paramBean, dataMap);

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		try
		{
			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);

		}
		catch (JCCWebServiceException se)
		{
			// 業務エラーを再throw
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●サービス処理結果の取得
		// 1.業務パラメータ管理一意照会SC（MYホームページURLのプロトコルを取得）
		mapper.getFUSV006901SC(bean, outputMap);
		// 3.料金コース_サブオプションサービス一意照会SC
		mapper.getFUSV006903SC(bean, outputMap, sbopSvcKeiCnt);

		// 有料フラグをサービスフォームbeanに設定
		boolean payFlag =
				bean.sendMessageBoolean(FUW02501SFConst.PAY_FLG, X31CWebConst.DATABEAN_SET_VALUE, setPayFlg(bean, outputMap, sbopSvcKeiCnt));

		// マンション区分を設定
		bean.sendMessageBoolean(FUW02501SFConst.MANSION_DIV, X31CWebConst.DATABEAN_SET_VALUE, getMansionDiv(bean, commoninfoBean, outputMap));

		// ●料金表の制御
		if (!payFlag)
		{
			// 無料の場合
			// 無料表示用の基本料金情報を設定する。
			JFUWebCommon.setFreePrcInfoMap(outputMap, SC_TITLE_FUSV006902);
		}

		// ●料金表情報の設定(FUSV008702SC、FUSV008701CC)
		JFUWebCommon.setPrcInfoArea(bean, outputMap, SC_TITLE_FUSV006902, CC_TITLE_FUSV006901, JFUScreenConst.SCREEN_ID_FUW02501);

		// ●BEAN情報
		// 現在のWEBID
		bean.sendMessageString(FUW02501SFConst.NOW_WEB_ID, X31CWebConst.DATABEAN_SET_VALUE, ssoInfoBean.sendMessageString(
				CommonInfoCFConst.WEB_ID_21, X31CWebConst.DATABEAN_GET_VALUE));
		// 現在のホームページURL
		bean.sendMessageString(FUW02501SFConst.NOW_HP_URL, X31CWebConst.DATABEAN_SET_VALUE, bean.sendMessageString(FUW02501SFConst.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));

		// 料金表表示現在日設定処理
		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_FUW02501);

		return true;
	}

	/**
	 * ホームページアクセス分析サービス申込画面の
	 * 確認ボタン押下時の処理を行います。
	 * 
	 * @return 処理結果（必ずtrue）
	 * @throws Exception 例外出力
	 */
	public boolean cfm() throws Exception
	{

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		execute(commoninfoBean, JPCModelConstant.FUNC_CD_2);

		// -------- 遷移先画面の指定 --------
		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW02502);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02502);

		return true;
	}

	/**
	 * ホームページアクセス分析サービス申込画面の
	 * 申し込むボタン押下時の処理を行います。
	 * 
	 * @return 処理結果（必ずtrue）
	 * @throws Exception 例外出力
	 */
	public boolean mskm() throws Exception
	{
		// -------------------------------------------------
		// フロントオンライン共通部品/共通関連チェック処理
		// -------------------------------------------------
		JFUWebCommon.checkCommonRelation(this, USECASE_ID_FUSV0070);

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		execute(commoninfoBean, JPCModelConstant.FUNC_CD_1);

		// ●現顧客リフレッシュ処理
		JFUWebCommon.refreshGenCustKei(this);

		// 申込完了メール送信部品呼出処理
		JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID);

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW02503);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02503);

		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_FUW02501);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW02501);

		return true;
	}

	/**
	 * サービスデータのチェックを行います。
	 * <br>
	 * @param resultMap 共有フォームBean情報
	 */
	private void checkSvcData(Map<String, Object> resultMap)
	{
		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);
		// Web ID存在チェック
		if (JFUWebCommon.isNull(opSvcKeiInfoBean))
		{
			// "0102"（契約状態エラー）
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		// (オプションサービス契約情報)URL取得
		String opSvcKeiUrlDom = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.URL_DOMAIN_28, X31CWebConst.DATABEAN_GET_VALUE);
		String opSvcKeiUrlAcc = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.URL_ACCOUNT_28, X31CWebConst.DATABEAN_GET_VALUE);
		// URL存在チェック
		// URL(ドメイン)またはURL(アカウント)がNULLの場合
		if (JFUWebCommon.isNull(opSvcKeiUrlDom) || JFUWebCommon.isNull(opSvcKeiUrlAcc))
		{
			// "0102"（契約状態エラー）
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

	}

	/**
	 * データBeanリストから0番目のデータBeanを取得します。 <BR>
	 * 
	 * @param bean
	 * @param componentID
	 * @return 取得したデータBean
	 */
	private X31SDataBeanAccess getX31SDataBeanAccess(X31SDataBeanAccess bean, String componentID)
	{
		X31SDataBeanAccessArray subBeanArray = bean.getDataBeanArray(componentID);
		X31SDataBeanAccess subBean = subBeanArray.getDataBean(0);
		if (null == subBean)
		{
			subBeanArray.addDataBean();
			subBean = subBeanArray.getDataBean(0);
		}
		return subBean;
	}

	/**
	 * マンション区分（有料文言制御用）を取得します。 <BR>
	 * 
	 * @param bean
	 * @param commoninfoBean
	 * @param outputMap
	 * @return true:マンション(全戸一括)かつ支払金あり / false:マンション(全戸一括)以外または支払金なし
	 */
	private boolean getMansionDiv(X31SDataBeanAccess bean, X31SDataBeanAccess commoninfoBean, HashMap<String, Object> outputMap)
	{
		// 有料フラグを取得
		boolean payFlg = bean.sendMessageBoolean(FUW02501SFConst.PAY_FLG, X31CWebConst.DATABEAN_GET_VALUE);

		// 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 kanyuKeiPayHoshikiCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.KANYU_KEI_PAY_HOSHIKI_CD_23, X31CWebConst.DATABEAN_GET_VALUE);

		// 料金クループコードが"04"(マンションタイプ )、かつ、加入契約支払方式コードが"003"(全戸一括)、
		// かつ、支払金が存在する場合、true
		boolean result = JFUStrConst.CD00133_04.equals(getPrcGrpCd(commoninfoBean)) && JFUStrConst.CD01216_003.equals(kanyuKeiPayHoshikiCd)
								&& (payFlg || chkPayInitialCost(outputMap));

		return result;
	}

	/**
	 * 料金グループコードを取得します。
	 *  <BR>
	 * @param commoninfoBean
	 * @return 料金グループコード
	 */
	private String getPrcGrpCd(X31SDataBeanAccess commoninfoBean)
	{
		String prcGrpCd = null;

		X31SDataBeanAccess webChgInfoBean = getX31SDataBeanAccess(commoninfoBean, CommonInfoCFConst.WEB_CHG_INFO);
		X31SDataBeanAccessArray genCustKeiInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO);

		for (int i = 0; i < genCustKeiInfoArray.getCount(); i++)
		{
			X31SDataBeanAccess genCustKeiInfoBean = genCustKeiInfoArray.getDataBean(i);

			X31SDataBeanAccessArray svcKeiInfoArray = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO);
			for (int j = 0; j < svcKeiInfoArray.getCount(); j++)
			{
				X31SDataBeanAccess svcKeiInfoBean = svcKeiInfoArray.getDataBean(j);
				prcGrpCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PRC_GRP_CD_23, X31CWebConst.DATABEAN_GET_VALUE);
			}
		}

		return prcGrpCd;
	}

	/**
	 * 共有フォームBeanの情報を取得します。 <BR>
	 * 
	 * @param commoninfoBean データBeanアクセスクラス
	 * @return 取得した情報を保持したマップ
	 */
	private Map<String, Object> getCommoninfoBeanInfo(X31SDataBeanAccess commoninfoBean)
	{

		Map<String, Object> resultMap = new HashMap<String, Object>();

		// ---- 共有フォームbean ----
		// ○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);
		if (JFUWebCommon.isNull(ssoInfoWebid))
		{
			X31SWebLog.DEBUG_LOG.debug("【SSO情報 WebID未設定エラー】");
			// システムエラーをスロー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ○現顧客情報
		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);
			// WEBID
			String opSvcKeiInfoWebid = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.WEB_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))
			{
				// "B002"Myホームページの場合
				if (ssoInfoWebid.equals(opSvcKeiInfoWebid) && JFUStrConst.CD00136_B002.equals(opSvCd))
				{
					// オプションサービス契約情報（確定）
					opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;
				}
			}

		}

		// アクセス分析サービス申込契約数
		int acsBnskCnt = 0;

		// ○サブオプションサービス契約情報
		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 sbopSvcKeiStat =
						tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_KEI_STAT_29, X31CWebConst.DATABEAN_GET_VALUE);

				// オプションサービス契約番号
				String opSvcKeiNo = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_29, X31CWebConst.DATABEAN_GET_VALUE);

				// サブオプションサービスコード
				String sbopSvcCd = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_CD_29, X31CWebConst.DATABEAN_GET_VALUE);

				// サブオプションサービスコード "D05"ホームページアクセス分析の場合
				if (!JFUStrConst.CD00137_D05.equals(sbopSvcCd))
				{
					continue;
				}

				// サブオプションサービス契約情報 サブオプションサービス契約ステータスが「910:解約済」と「920:キャンセル済」の場合
				// スキップ
				if (JFUStrConst.CD00037_910.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_920.equals(sbopSvcKeiStat))
				{
					continue;
				}

				// オプションサービス契約番号 = オプションサービス契約情報.オプションサービス契約番号
				if (opInfoOpSvcKeiNo.equals(opSvcKeiNo))
				{
					// 契約件数をカウント
					acsBnskCnt++;
				}
			}
		}

		// ●マップにセット
		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.SEIKY_KEI_INFO, seikyKeiInfoBean); // 請求契約情報
		resultMap.put(CommonInfoCFConst.OP_SVC_KEI_INFO, opSvcKeiInfoBean); // オプションサービス契約情報
		resultMap.put(CommonInfoCFConst.SBOP_SVC_KEI_INFO, sbopSvcKeiInfoBean); // サブオプションサービス契約情報
		resultMap.put(SBOP_SVC_KEI_CNT, acsBnskCnt); // サブオプションサービス契約数

		return resultMap;
	}

	/**
	 * サービス(申込)実行処理を行います。
	 * 
	 * <br>
	 * @param commoninfoBean 共有フォームBean
	 * @param funcCd 機能コード
	 * @throws Exception 例外をスローする。
	 */
	private void execute(X31SDataBeanAccess commoninfoBean, String funcCd) throws Exception
	{
		// ●共有フォーム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);

		// ---- サービスフォーム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_FUSV0070);

		FUSV0070_FUSV0070OPDBMapper mapper = new FUSV0070_FUSV0070OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = { bean, ssoInfoBean, seikyKeiInfoBean, opSvcKeiInfoBean, svcKeiInfoBean };

		// 1.申込内容承認登録SC(EKK0011D020)
		mapper.setFUSV007001SC(paramBean, dataMap, funcCd);
		// 2.サブオプションサービス契約<ISP>登録SC(EKK0411D010)
		mapper.setFUSV007002SC(paramBean, dataMap, funcCd);
		// 3.サブオプションサービス契約<ISP>照査締結SC(EKK0411C040)
		mapper.setFUSV007003SC(paramBean, dataMap, funcCd);
		// 4.サブオプションサービス契約<ISP>使用開始SC(EKK0411C050)
		mapper.setFUSV007004SC(paramBean, dataMap, funcCd);
		// 5.進捗登録SC(EKK1091D010)
		mapper.setFUSV007005SC(paramBean, dataMap, funcCd);
		// 6.申込明細照査・後続業務依頼SC(EKK0021C060)
		mapper.setFUSV007006SC(paramBean, dataMap, funcCd);
		// 7.サブオプションサービス契約<ISP>照査SC(EKK0411C020)
		mapper.setFUSV007007SC(paramBean, dataMap, funcCd);

		// サービスIF結果データ移送CC(JFUTransferCC)
		mapper.setFUSV007001CC(paramBean, dataMap, funcCd, this);
		// サービスオーダ発行CC(JKKHakkoSODCC)
		mapper.setFUSV007002CC(paramBean, dataMap, funcCd);

		// オプションサービス契約ステータス設定
		JFUWebCommon.setOpSvcKeiStatMyHp(this, dataMap);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();
		try
		{
			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 関連チェックを行う
			checkException(se);
		}
	}

	/**
	 * ホームページアクセス分析申込の関連チェックを行います。
	 * 
	 * @param se 例外
	 */
	private void checkException(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))
		{
			// 上限チェック
			// テンプレートIDが"EKK0411D010"かつエラーフラグが"EG"かつアイテムが"オプションサービス契約番号"の場合
			if (EKK0411D010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EG.equals(errFlg) && OP_SVC_KEI_NO.equals(itemid))
			{
				// 契約済み(0103)エラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0103);
			}
			// タイムスタンプチェック
			// テンプレートIDが"EKK0391D010"かつエラーフラグが"EA"かつアイテムが"更新年月日時分秒(更新前)"の場合
			if (EKK0411D010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemid))
			{
				// 更新不可(0204)エラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0204);
			}
		}

		// システムエラー
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
	}

	/**
	 * 有料フラグを設定します。
	 * <br>
	 * @param bean
	 * @param outputMap
	 * @param keiCnt
	 * @return true:有料 / false:無料（支払い金なし）
	 */
	private boolean setPayFlg(X31SDataBeanAccess bean, HashMap<String, Object> outputMap, int keiCnt)
	{
		boolean res = false;

		// ホームページアクセス分析無料数
		int hpAcsMryoCnt = bean.sendMessageLong(FUW02501SFConst.SVCTK_BUT_MRYO_VALUE, X31CWebConst.DATABEAN_GET_VALUE).intValue();
		// 無料残数 = 無料数 - 契約数
		int mryoCnt = hpAcsMryoCnt - keiCnt;

		// 固定単価有無チェック
		if (chkPayKoteiTanka(outputMap))
		{
			if (mryoCnt <= 0)
			{
				// 固定単価あり＆無料数なし
				res = true;
			}
			else
			{
				// 固定単価あり＆無料数あり
				res = false;
			}
		}
		else
		{
			// 固定単価なし
			res = false;
		}

		return res;
	}

	/**
	 * 有料フラグ判定（固定単価）処理を行います。
	 * @param bean
	 * @param outputMap
	 * @return true:固定単価あり / false:固定単価なし（無料）
	 */
	@SuppressWarnings("unchecked")
	public boolean chkPayKoteiTanka(HashMap<String, Object> outputMap)
	{
		boolean res = false;
		HashMap<String, Object> parentMap = null;

		if (outputMap.containsKey(SC_TITLE_FUSV006902))
		{
			parentMap = (HashMap<String, Object>)outputMap.get(SC_TITLE_FUSV006902);
		}

		if (null != parentMap && parentMap.containsKey(EKK0601B001_LIST))
		{
			ArrayList<HashMap<String, Object>> childList = (ArrayList<HashMap<String, Object>>)parentMap.get(EKK0601B001_LIST);

			if (childList != null && childList.size() > 0)
			{
				for (int i = 0; i < childList.size(); i++)
				{
					HashMap<String, Object> childmap = 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")
	public boolean chkPayInitialCost(HashMap<String, Object> outputMap)
	{
		boolean res = false;
		HashMap<String, Object> parentMap = null;

		if (outputMap.containsKey(CC_TITLE_FUSV006901))
		{
			parentMap = (HashMap<String, Object>)outputMap.get(CC_TITLE_FUSV006901);
		}

		if (null != parentMap && parentMap.containsKey(EKK0721A010_LIST))
		{
			ArrayList<HashMap<String, Object>> childList = (ArrayList<HashMap<String, Object>>)parentMap.get(EKK0721A010_LIST);

			if (childList != null && childList.size() > 0)
			{
				// 初期費用がある場合
				res = true;
			}
			else
			{
				// 初期費用がない場合
				res = false;
			}
		}

		return res;
	}

}
