/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：FUW03501SFLogic
*	ソースファイル名：FUW03501SFLogic.java
*	作成者			：富士通
*	日付			：2011年06月01日
*＜機能概要＞
*	ダイヤルアップ接続サービス申込のビューロジッククラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/01	FJ)中尾		新規作成
*	v3.00		2012/04/16  FJ)大野   【ANK-0041-00-00】 申込完了メール対応
*	v8.00		2014/01/27  FJ)文元   【ANK-1589-00-00】消費増税に伴う料金施策
*
**********************************************************************/
package eo.web.webview.FUW03501SF;

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.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.JFUCommonRelationCheck;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0073_FUSV0073OPDBMapper;
import eo.web.webview.mapping.FUSV0074_FUSV0074OPDBMapper;

/**
 * ダイヤルアップ接続サービス申込のビューロジッククラスです。
 *
 * <br>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW03501SFLogic extends JCCWebBusinessLogic
{
	/** サービスID */
	private static final String USECASE_ID_FUSV0073 = "FUSV0073";
	/** サービスID */
	private static final String USECASE_ID_FUSV0074 = "FUSV0074";

	/** サービスIF-ID EKK0361D010 */
	private static final String EKK0361D010 = "EKK0361D010";
	/** サービスIF-ID EKK0351C120 */
	private static final String EKK0351C120 = "EKK0351C120";

	/** 料金プラン一覧照会（オプションサービスコード）SC */
	private static final String FUSV007301SC = "FUSV007301SC";
	/** 初期費用一覧照会CC */
	private static final String FUSV007301CC = "FUSV007301CC";
	/** ダイヤルアップ関連チェックCC */
	private static final String FUSV007302CC = "FUSV007302CC";

	/** 料金プラン一覧照会（オプションサービスコード）明細リスト */
	private static final String EKK0591B001CBSMSG1LIST = "EKK0591B001CBSMsg1List";
	/** 初期費用一覧照会明細リスト */
	private static final String EKK0721A010CBSMSG1LIST = "EKK0721A010CBSMsg1List";

	/** オプションサービスコード */
	private static final String OP_SVC_CD = "op_svc_cd";
	/** オプションサービス契約番号 */
	private static final String OP_SVC_KEI_NO = "op_svc_kei_no";
	/** プラン開始年月日 */
	private static final String PLAN_STAYMD = "plan_staymd";
	/** 料金コースコード */
	private static final String PCRS_CD = "pcrs_cd";
	/** 料金プラン固定金額 */
	private static final String PPLAN_KOTEI_AMNT = "pplan_kotei_amnt";
	/** 新規／変更／照会区分 */
	private static final String CHG_DIV = "chg_div";
	/** 割り込み画面ID付加文字列 */
	private static final String WARIKOMI_GAMEN_ID_FUKA_STR = "0PJP";

	/** 登録区分 新規 */
	private static final String TRK_DIV_SINKI = "0";
	/** 登録区分 変更 */
	private static final String TRK_DIV_HENKO = "1";

	/** アンダーバー */
	private static final String STR_UNDERBAR = "_";

	/** 現在契約中のプラン名称 */
	private static final String PATH_PPLAN_NM = "DISPSETTING/SETTING[@screenId='FUW03501']/DISPTEXT[@groupid='PPLAN_NM']";
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";

	/** 申込完了メール送信部品呼出機能ID */
	private static final String FUW035_1 = "FUW035_1";

	/** 新規／変更／照会区分 新規 */
	private static final String CHG_DIV_0 = "0";

	/** 新規／変更／照会区分 変更 */
	private static final String CHG_DIV_1 = "1";

	/** 新規／変更／照会区分 照会 */
	private static final String CHG_DIV_2 = "2";

	/**
	 * 初期処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{
		// ●共有フォームBeanのデータBeanアクセスクラスを取得する。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより情報を取得する。
		HashMap<String, Object> commoninfoMap = getCommonInfo(commoninfoBean);

		// 各Beanを格納
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)commoninfoMap.get(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)commoninfoMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);

		// ●サービスフォームBeanのデータBeanアクセスクラスを取得する。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// オプションサービスコードを設定
		bean.sendMessageString(FUW03501SFConst.NOW_OP_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, (String)commoninfoMap
				.get(FUW03501SFConst.NOW_OP_SVC_CD));

		// 各Beanを配列でまとめる
		X31SDataBeanAccess[] paramBean = { bean, svcKeiInfoBean, opSvcKeiInfoBean };

		// ユースケースID格納用マップ
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0073);

		FUSV0073_FUSV0073OPDBMapper mapper = new FUSV0073_FUSV0073OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// ●上りマッピング
		// 料金プラン一覧照会（オプションサービスコード）SC
		dataMap = mapper.setFUSV007301SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// 初期費用CC
		dataMap = mapper.setFUSV007301CC(paramBean, dataMap);
		// 料金コース_オプションサービス一意照会SC
		dataMap = mapper.setFUSV007303SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 初期費用CC
		dataMap = mapper.setFUSV007302CC(paramBean, dataMap);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

		// ●サービスの呼び出しを行う
		try
		{
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 初期表示はシステムエラー画面へ遷移させる。
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●下りマッピング
		// 料金プラン一覧照会SC
		mapper.getFUSV007301SC(bean, outputMap);
		// 料金コース_オプションサービス一意照会SC
		mapper.getFUSV007303SC(bean, outputMap);


		// 画面IDと画面名格納用
		String nextScreenId = null;
		String nextScreenName = null;

		// ダイヤルアップ接続サービス契約数 設定＆取得
		bean.sendMessageString(FUW03501SFConst.DIAL_CONNECT_NOW_CNT, X31CWebConst.DATABEAN_SET_VALUE, commoninfoMap.get(
				FUW03501SFConst.DIAL_CONNECT_NOW_CNT).toString());
		int nowOpCnt = Integer.parseInt(bean.sendMessageString(FUW03501SFConst.DIAL_CONNECT_NOW_CNT, X31CWebConst.DATABEAN_GET_VALUE));

		// 無料オプションサービス数を取得
		int muryoCnt = Integer.parseInt(bean.sendMessageString(FUW03501SFConst.DIAL_CONNECT_KEI_MURYO, X31CWebConst.DATABEAN_GET_VALUE));

		// 無料取得残数を設定
		if (muryoCnt > 0)
		{
			bean.sendMessageString(FUW03501SFConst.DIAL_CONNECT_KEI_MURYO, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(muryoCnt - nowOpCnt));
		}

		// 新規／変更／照会区分
		String chgDiv = (String)((HashMap)outputMap.get(FUSV007302CC)).get(CHG_DIV);

		// ●新規／変更／照会区分
		if (CHG_DIV_0.equals(chgDiv))
		{
			// 区分(0:新規)を設定
			bean.sendMessageString(FUW03501SFConst.CHG_DIV, X31CWebConst.DATABEAN_SET_VALUE, TRK_DIV_SINKI);

			// オプションサービスコードを設定
			bean.sendMessageString(FUW03501SFConst.NOW_OP_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.CD00136_B020);

			// 遷移先画面の指定
			nextScreenId = JFUScreenConst.SCREEN_ID_FUW03501;
			nextScreenName = JFUScreenConst.SCREEN_NAME_FUW03501;
		}
		else
		{
			// 区分(1:変更)を設定
			bean.sendMessageString(FUW03501SFConst.CHG_DIV, X31CWebConst.DATABEAN_SET_VALUE, TRK_DIV_HENKO);

			// 現在契約中の料金プラン判定文字列を設定
			bean.sendMessageString(FUW03501SFConst.NOW_PPLAN_STR, X31CWebConst.DATABEAN_SET_VALUE, (String)commoninfoMap
					.get(FUW03501SFConst.NOW_PPLAN_STR));

			// 現在の認証IDを設定
			bean.sendMessageString(FUW03501SFConst.NOW_DIAL_NISHO_ID, X31CWebConst.DATABEAN_SET_VALUE, (String)commoninfoMap
					.get(FUW03501SFConst.NOW_DIAL_NISHO_ID));

			// 現在の認証IDパスワードを設定
			bean.sendMessageString(FUW03501SFConst.AF_DIAL_NINSHO_ID_PWD, X31CWebConst.DATABEAN_SET_VALUE, (String)commoninfoMap
					.get(FUW03501SFConst.AF_DIAL_NINSHO_ID_PWD));

			// 現在契約中の料金プラン名を設定
			setPplanName(bean, commoninfoMap, JPCModelConstant.FUNC_CD_1);

			// 変更可能期間のチェック
			if (CHG_DIV_1.equals(chgDiv))
			{
				// ▼変更可能
				// 現在契約中の料金プランを選択する
				bean.sendMessageString(FUW03501SFConst.CHOICE_PPLAN_STR, X31CWebConst.DATABEAN_SET_VALUE, (String)commoninfoMap
						.get(FUW03501SFConst.NOW_PPLAN_STR));

				nextScreenId = JFUScreenConst.SCREEN_ID_FUW03501;
				nextScreenName = JFUScreenConst.SCREEN_NAME_FUW03501;
			}
			else if (CHG_DIV_2.equals(chgDiv))
			{
				// ▼変更不可能(照会画面へ遷移する)
				nextScreenId = JFUScreenConst.SCREEN_ID_FUW03504;
				nextScreenName = JFUScreenConst.SCREEN_NAME_FUW03504;

				// 割り込み設定
				super.setTransferPageId(JFUScreenConst.SCREEN_ID_FUW03504 + WARIKOMI_GAMEN_ID_FUKA_STR);
			}
		}

		// 有料フラグを設定
		bean.sendMessageBoolean(FUW03501SFConst.PAY_FLG, X31CWebConst.DATABEAN_SET_VALUE, setPayFlg(bean, outputMap));

		// マンション区分を設定
		bean.sendMessageBoolean(FUW03501SFConst.MANSION_DIV, X31CWebConst.DATABEAN_SET_VALUE, 
				setMansionDiv(bean, commoninfoMap, outputMap, commoninfoBean));

		// 料金選択ボタンのマッピング
		mapper.getPcrsListBean(this, bean, outputMap);
		// 料金表のマッピング
		mapper.getPriceAreaBean(bean, outputMap, (String)commoninfoMap.get(CommonInfoCFConst.PRC_GRP_CD_23), chkPayInitialCost(outputMap));

		// 料金表表示現在日設定処理
		JFUWebCommon.setPrcDspNowDay(this);

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		return true;
	}

	/**
	 * 申込画面の確認ボタン押下処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean cfm() throws Exception
	{
		// ●共有フォームBeanのデータBeanアクセスクラスを取得する。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより情報を取得する。
		HashMap<String, Object> commoninfoMap = getCommonInfo(commoninfoBean);

		// 各Beanを取得
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)commoninfoMap.get(CommonInfoCFConst.SSO_INFO);
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)commoninfoMap.get(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess seikyKeiInfoBean = (X31SDataBeanAccess)commoninfoMap.get(CommonInfoCFConst.SEIKY_KEI_INFO);
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)commoninfoMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);

		// ●サービスフォームBeanのデータBeanアクセスクラスを取得する。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 料金コースコード(選択値)と料金プランコード(選択値)を設定
		String[] str = bean.sendMessageString(FUW03501SFConst.CHOICE_PPLAN_STR, X31CWebConst.DATABEAN_GET_VALUE).split(STR_UNDERBAR);
		bean.sendMessageString(FUW03501SFConst.CHOICE_PCRS_CD, X31CWebConst.DATABEAN_SET_VALUE, str[1]);
		bean.sendMessageString(FUW03501SFConst.CHOICE_PPLAN_CD, X31CWebConst.DATABEAN_SET_VALUE, str[2]);

		// 各Beanを配列でまとめる
		X31SDataBeanAccess[] paramBean = { bean, ssoInfoBean, svcKeiInfoBean, seikyKeiInfoBean, opSvcKeiInfoBean };

		// ユースケースID格納用マップ
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0074);

		FUSV0074_FUSV0074OPDBMapper mapper = new FUSV0074_FUSV0074OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// 申込内容承認登録SC
		dataMap = mapper.setFUSV007401SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// オプションサービス契約<ISP>登録SC
		dataMap = mapper.setFUSV007402SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// オプションサービス契約<ISP>照査SC
		dataMap = mapper.setFUSV007408SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// オプションサービス契約<ISP>照査締結SC
		dataMap = mapper.setFUSV007403SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// オプションサービス契約<ISP>開始SC
		dataMap = mapper.setFUSV007404SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// オプションサービス契約手続中料金プラン変更
		dataMap = mapper.setFUSV007409SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2, commoninfoMap);
		// オプションサービス契約料金プラン変更SC
		dataMap = mapper.setFUSV007405SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2, commoninfoMap);
		// 進捗登録SC
		dataMap = mapper.setFUSV007406SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2, commoninfoMap);
		// 申込明細照査・後続業務依頼SC
		dataMap = mapper.setFUSV007407SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// データ移送CC
		dataMap = mapper.setFUSV007401CC(paramBean, dataMap, this);
		// オーダ発行CC
		dataMap = mapper.setFUSV007402CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2, commoninfoMap);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

		// サービス契約ステータスを設定
		JFUWebCommon.setSvcKeiStat(this, dataMap);

		// ●サービスの呼び出しを行う(申込)
		try
		{
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			chkServiceIfError(se);
		}

		// 登録後または変更後の料金プラン名を設定
		setPplanName(bean, commoninfoMap, JPCModelConstant.FUNC_CD_2);

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW03502);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW03502);

		return true;
	}

	/**
	 * 確認画面の申し込むボタン押下時の処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean mskm() throws Exception
	{
		// ●共通関連チェック
		JFUCommonRelationCheck.checkCommonRelation(this, USECASE_ID_FUSV0074);

		// ●共有フォームBeanのデータBeanアクセスクラスを取得する。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより情報を取得する。
		HashMap<String, Object> commoninfoMap = getCommonInfo(commoninfoBean);

		// 各Beanを取得
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)commoninfoMap.get(CommonInfoCFConst.SSO_INFO);
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)commoninfoMap.get(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess seikyKeiInfoBean = (X31SDataBeanAccess)commoninfoMap.get(CommonInfoCFConst.SEIKY_KEI_INFO);
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)commoninfoMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);

		// ●サービスフォームBeanのデータBeanアクセスクラスを取得する。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 各Beanを配列でまとめる
		X31SDataBeanAccess[] paramBean = { bean, ssoInfoBean, svcKeiInfoBean, seikyKeiInfoBean, opSvcKeiInfoBean };

		// ユースケースID格納用マップ
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0074);

		FUSV0074_FUSV0074OPDBMapper mapper = new FUSV0074_FUSV0074OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// 申込内容承認登録SC
		dataMap = mapper.setFUSV007401SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// オプションサービス契約<ISP>登録SC
		dataMap = mapper.setFUSV007402SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// オプションサービス契約<ISP>照査SC
		dataMap = mapper.setFUSV007408SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// オプションサービス契約<ISP>照査締結SC
		dataMap = mapper.setFUSV007403SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// オプションサービス契約<ISP>開始SC
		dataMap = mapper.setFUSV007404SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// オプションサービス契約手続中料金プラン変更
		dataMap = mapper.setFUSV007409SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1, commoninfoMap);
		// オプションサービス契約料金プラン変更SC
		dataMap = mapper.setFUSV007405SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1, commoninfoMap);
		// 進捗登録SC
		dataMap = mapper.setFUSV007406SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1, commoninfoMap);
		// 申込明細照査・後続業務依頼SC
		dataMap = mapper.setFUSV007407SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		// データ移送CC
		dataMap = mapper.setFUSV007401CC(paramBean, dataMap, this);
		// オーダ発行CC
		dataMap = mapper.setFUSV007402CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1, commoninfoMap);

		// サービス契約ステータスを設定
		JFUWebCommon.setSvcKeiStat(this, dataMap);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

		// ●サービスの呼び出しを行う(申込)
		try
		{
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			chkServiceIfError(se);
		}

		// 申込完了メール送信部品呼出処理
		JFUWebCommon.sendMskmFinMail(this, FUW035_1);

		// ●下りマッピング
		// 新規申込の場合
		if (TRK_DIV_SINKI.equals(bean.sendMessageString(FUW03501SFConst.CHG_DIV, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// 照査済の場合
			if (JFUStrConst.CD00037_020.equals(JFUWebCommon.getSvcKeiStat(this)))
			{
				// オプションサービス契約<ISP>照査SC
				mapper.getFUSV007408SC(bean, outputMap);
			}
			// 締結済、サービス提供中の場合
			else
			{
				// オプションサービス契約<ISP>照査締結SC
				mapper.getFUSV007403SC(bean, outputMap);
			}
		}

		// ●現顧客情報リフレッシュ処理
		JFUWebCommon.refreshGenCustKei(this);
		// 現顧客情報を再取得
		commoninfoMap = getCommonInfo(commoninfoBean);

		// 変更申込の場合
		if (TRK_DIV_HENKO.equals(bean.sendMessageString(FUW03501SFConst.CHG_DIV, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// 認証IDを設定
			bean.sendMessageString(FUW03501SFConst.AF_DIAL_NINSHO_ID, X31CWebConst.DATABEAN_SET_VALUE, (String)commoninfoMap
					.get(FUW03501SFConst.NOW_DIAL_NISHO_ID));
		}

		// 認証IDパスワードを設定
		bean.sendMessageString(FUW03501SFConst.AF_DIAL_NINSHO_ID_PWD, X31CWebConst.DATABEAN_SET_VALUE, (String)commoninfoMap
				.get(FUW03501SFConst.AF_DIAL_NINSHO_ID_PWD));

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW03503);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW03503);

		return true;
	}

	/**
	 * 確認画面(FUW03502)の戻るボタン押下処理です。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean back() throws Exception
	{
		// 共有フォームBean情報を取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW03501);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW03501);

		return true;
	}

	/**
	 * 共有フォームBeanから値を取得します。
	 * 
	 * <br>
	 * @param commoninfoBean
	 * @return HashMap
	 */
	private static HashMap<String, Object> getCommonInfo(X31SDataBeanAccess commoninfoBean)
	{
		// 返却用マップ
		HashMap<String, Object> resMap = new HashMap<String, Object>();

		// 各Bean格納用
		X31SDataBeanAccess ssoInfoBean = null;
		X31SDataBeanAccess genCustKeiInfoBean = null;
		X31SDataBeanAccess svcKeiInfoBean = null;
		X31SDataBeanAccess seikyKeiInfoBean = null;
		X31SDataBeanAccess svcKeiUcwkInfoBean = null;
		X31SDataBeanAccess opSvcKeiInfoBean = null;

		// 各値格納用
		int dialKeiCnt = 0;
		String prcGpCd = null;
		String opSvcCd = null;
		String pcrsCd = null;
		String pplanCd = null;
		String ninshoId = null;
		String ninshoIdPwd = null;
		String opSvcKeiNo = null;
		String geneAddTime = null;
		String updDtm = null;

		// ★WEB変更の情報を取得
		X31SDataBeanAccessArray webChgInfoBeanArray = commoninfoBean.getDataBeanArray(CommonInfoCFConst.WEB_CHG_INFO);
		X31SDataBeanAccess webChgInfoBean = webChgInfoBeanArray.getDataBean(0);
		X31SDataBeanAccessArray genCustKeiInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO);

		// ★SSO情報を取得
		X31SDataBeanAccessArray ssoInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.SSO_INFO);
		ssoInfoBean = ssoInfoArray.getDataBean(0);

		// ★現顧客情報を取得
		genCustKeiInfoBean = genCustKeiInfoArray.getDataBean(0);

		// ★サービス契約情報(現顧客情報の子)を取得
		X31SDataBeanAccessArray svcKeiInfoArray = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO);
		svcKeiInfoBean = svcKeiInfoArray.getDataBean(0);

		prcGpCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PRC_GRP_CD_23, X31CWebConst.DATABEAN_GET_VALUE);

		// ★サービス契約内訳情報(サービス契約情報の子)を取得
		X31SDataBeanAccessArray svcKeiUcwkInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO);
		svcKeiUcwkInfoBean = svcKeiUcwkInfoArray.getDataBean(0);

		ninshoIdPwd = svcKeiUcwkInfoBean.sendMessageString(CommonInfoCFConst.ISP_NINSHO_ID_PWD_24, X31CWebConst.DATABEAN_GET_VALUE);

		// ★オプションサービス契約情報(サービス契約内訳情報の子)を取得
		X31SDataBeanAccessArray opSvcKeiInfoArray = svcKeiUcwkInfoBean.getDataBeanArray(CommonInfoCFConst.OP_SVC_KEI_INFO);
		for (int n = 0; n < opSvcKeiInfoArray.getCount(); n++)
		{
			opSvcKeiInfoBean = opSvcKeiInfoArray.getDataBean(n);

			// ダイヤルアップ接続サービス契約数
			// サービス契約ステータスが910(解約済)または920(キャンセル済)の場合セットしない
			String chkOpSvcCd = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_CD_28, X31CWebConst.DATABEAN_GET_VALUE);
			String opSvcKeiStat = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_STAT_28, X31CWebConst.DATABEAN_GET_VALUE);

			if (JFUStrConst.CD00136_B020.equals(chkOpSvcCd)
					&& (!JFUStrConst.CD00037_910.equals(opSvcKeiStat) || !JFUStrConst.CD00037_920.equals(opSvcKeiStat)))
			{
				dialKeiCnt++;

				opSvcCd = chkOpSvcCd;
				pcrsCd = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.PCRS_CD_28, X31CWebConst.DATABEAN_GET_VALUE);
				pplanCd = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.PPLAN_CD_28, X31CWebConst.DATABEAN_GET_VALUE);

				opSvcKeiNo = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_28, X31CWebConst.DATABEAN_GET_VALUE);
				geneAddTime = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.GENE_ADD_DTM_28, X31CWebConst.DATABEAN_GET_VALUE);
				updDtm = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.LAST_UPD_DTM_28, X31CWebConst.DATABEAN_GET_VALUE);

				// ダイヤルアップ認証IDを取得
				if (opSvcKeiNo != null)
				{
					// 完了画面(変更申込)＆照会画面表示用
					ninshoId = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.DUPCON_NINSHO_ID_28, X31CWebConst.DATABEAN_GET_VALUE);
					//ninshoId = "ninshoID@hf.eonet.ne.jp";
				}
			}
		}

		// ★請求契約情報(サービス契約情報の子)を取得
		X31SDataBeanAccessArray seikyKeiInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SEIKY_KEI_INFO);
		for (int k = 0; k < seikyKeiInfoArray.getCount(); k++)
		{
			seikyKeiInfoBean = seikyKeiInfoArray.getDataBean(k);
		}

		// 料金プラン判定文字列連結
		StringBuffer pplanStr = new StringBuffer(16);
		pplanStr.append(opSvcCd);
		pplanStr.append(STR_UNDERBAR);
		pplanStr.append(pcrsCd);
		pplanStr.append(STR_UNDERBAR);
		pplanStr.append(pplanCd);

		// 各Beanをマップに格納
		resMap.put(CommonInfoCFConst.SSO_INFO, ssoInfoBean);
		resMap.put(CommonInfoCFConst.SVC_KEI_INFO, svcKeiInfoBean);
		resMap.put(CommonInfoCFConst.SEIKY_KEI_INFO, seikyKeiInfoBean);
		resMap.put(CommonInfoCFConst.OP_SVC_KEI_INFO, opSvcKeiInfoBean);

		// 各値をマップに格納
		resMap.put(FUW03501SFConst.DIAL_CONNECT_NOW_CNT, dialKeiCnt);
		resMap.put(CommonInfoCFConst.PRC_GRP_CD_23, prcGpCd);
		resMap.put(FUW03501SFConst.NOW_OP_SVC_CD, opSvcCd);
		resMap.put(FUW03501SFConst.NOW_PCRS_CD, pcrsCd);
		resMap.put(FUW03501SFConst.NOW_PPLAN_CD, pplanCd);
		resMap.put(FUW03501SFConst.NOW_PPLAN_STR, pplanStr.toString());
		resMap.put(FUW03501SFConst.NOW_DIAL_NISHO_ID, ninshoId);
		resMap.put(FUW03501SFConst.AF_DIAL_NINSHO_ID_PWD, ninshoIdPwd);
		resMap.put(CommonInfoCFConst.OP_SVC_KEI_NO_28, opSvcKeiNo);
		resMap.put(CommonInfoCFConst.GENE_ADD_DTM_28, geneAddTime);
		resMap.put(CommonInfoCFConst.LAST_UPD_DTM_28, updDtm);

		return resMap;
	}

	/**
	 * 料金プラン名称取得処理です。
	 * <br>
	 * @param bean
	 * @param inMap
	 * @param func_code
	 * @return 料金プラン名
	 * @throws Exception
	 */
	private X31SDataBeanAccess setPplanName(X31SDataBeanAccess bean, HashMap<String, Object> inMap, String func_code) throws Exception
	{
		// プラン名マップを取得
		Map<String, String> pplanNmMap = JFUWebCommon.getDispItemsAsMap(PATH_PPLAN_NM, QUERY_ATTR_NAME);

		if (inMap != null && pplanNmMap != null && JPCModelConstant.FUNC_CD_1.equals(func_code))
		{
			// 契約中の料金プラン名をデータBeanに設定
			bean.sendMessageString(FUW03501SFConst.NOW_PPLAN_NM, X31CWebConst.DATABEAN_SET_VALUE, pplanNmMap.get(inMap
					.get(FUW03501SFConst.NOW_PPLAN_STR)));
		}
		else if (inMap != null && pplanNmMap != null && JPCModelConstant.FUNC_CD_2.equals(func_code))
		{
			// 変更後の料金プラン名をデータBeanに設定
			bean.sendMessageString(FUW03501SFConst.AF_PPLAN_NM, X31CWebConst.DATABEAN_SET_VALUE, pplanNmMap.get(bean.sendMessageString(
					FUW03501SFConst.CHOICE_PPLAN_STR, X31CWebConst.DATABEAN_GET_VALUE)));
		}

		return bean;
	}

	/**
	 * マンション区分を設定します。
	 * <br>
	 * @param bean サービスフォームBean
	 * @param commoninfoMap 共有フォームBeanマップ
	 * @param outputMap サービスIFアウトマップ
	 * @param commoninfoBean 共有フォームBean
	 * @return true:マンション(全戸一括)かつ支払い金有り / false:マンション(全戸一括)以外または支払い金無し
	 */
	@SuppressWarnings("unchecked")
	private boolean setMansionDiv(X31SDataBeanAccess bean, HashMap commoninfoMap, HashMap<Object, Object> outputMap, X31SDataBeanAccess commoninfoBean)
	{
		// 有料フラグを取得
		boolean payFlg = bean.sendMessageBoolean(FUW03501SFConst.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 prcGrpCd = (String)commoninfoMap.get(CommonInfoCFConst.PRC_GRP_CD_23);
		// 加入契約支払方式コード
		String kanyuKeiPayHoshikiCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.KANYU_KEI_PAY_HOSHIKI_CD_23, X31CWebConst.DATABEAN_GET_VALUE);

		// 料金グループコードが"04"(マンションタイプ)、かつ、加入契約支払方式コードが"003"(全戸一括)、
		// かつ支払い金がある場合、「true」
		boolean result = JFUStrConst.CD00133_04.equals(prcGrpCd) && JFUStrConst.CD01216_003.equals(kanyuKeiPayHoshikiCd)
							&& (payFlg || chkPayInitialCost(outputMap));

		return result;
	}

	/**
	 * 有料フラグを設定します。
	 * <br>
	 * @param bean サービスフォームBean
	 * @param outputMap サービスIFアウトマップ
	 * @return true:有料 / false:無料（支払い金なし）
	 */
	private boolean setPayFlg(X31SDataBeanAccess bean, HashMap<Object, Object> outputMap)
	{
		boolean res = false;

		// 無料数を取得
		int muryoCnt = Integer.parseInt(bean.sendMessageString(FUW03501SFConst.DIAL_CONNECT_KEI_MURYO, X31CWebConst.DATABEAN_GET_VALUE));

		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(FUSV007301SC))
		{
			parentMap = (HashMap)outputMap.get(FUSV007301SC);
		}

		if (null != parentMap && parentMap.containsKey(EKK0591B001CBSMSG1LIST))
		{
			ArrayList childList = (ArrayList)parentMap.get(EKK0591B001CBSMSG1LIST);

			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;
						break;
					}
					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(FUSV007301CC))
		{
			parentMap = (HashMap)outputMap.get(FUSV007301CC);
		}

		if (null != parentMap && parentMap.containsKey(EKK0721A010CBSMSG1LIST))
		{
			ArrayList childList = (ArrayList)parentMap.get(EKK0721A010CBSMSG1LIST);

			if (childList != null && childList.size() > 0)
			{
				// 初期費用がある場合
				res = true;
			}
			else
			{
				// 初期費用がない場合
				res = false;
			}
		}

		return res;
	}

	/**
	 * サービスIFの関連チェックエラーの処理です。
	 * <br>
	 * @param se JCCWebServiceException
	 */
	private void chkServiceIfError(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 (EKK0361D010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EG.equals(errFlg) && OP_SVC_CD.equals(itemid))
			{
				// 契約状態エラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}

			// "ダイヤルアップ接続"の件数が上限を超えた場合、エラー
			else if (EKK0351C120.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EC.equals(errFlg) && OP_SVC_KEI_NO.equals(itemid))
			{
				// 契約状態エラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}

			// "プラン開始年月日"と"（ダイヤルアップ接続変更申し込み不可期間)"の合算期間が運用日付以降の日付の場合、エラー
			else if (EKK0351C120.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && PLAN_STAYMD.equals(itemid))
			{
				// 利用制限エラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0101);
			}

			// "オプションサービス契約番号"、"料金コースコード"が設定されていて、"オプションサービスコード"が"ダイヤルアップ接続"の場合
			else if (EKK0351C120.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EE.equals(errFlg) && PCRS_CD.equals(itemid))
			{
				// 更新不可エラー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0204);
			}

			// 上記以外の場合、システムエラー
			else
			{
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
			}
		}
		else
		{
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}
	}
}