/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：FUW11001SFLogic
 *   ソースファイル名：FUW11001SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2014年04月30日
 *＜機能概要＞
 *   電話オプションパック申込解約のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v9.00.00    2014/04/30   FJ）谷本    新規作成
 *   v14.00.00   2015/04/03   FJ）谷本    【OM-2015-0000236】 割引の解約不正チェック
 *   v33.00.00   2017/08/31   FJ) 西川    【ANK-2794-00-00】フロントの督促ST制限強化
 *   v47.00.00   2019/10/08   FJ) 大島    ANK-3763-00-00_フロントWebの転送電話オプション受付停止対応
 *
 **********************************************************************/
package eo.web.webview.FUW11001SF;

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.common.JSYwebLog;
import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
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.common.util.JPCUtilCommon;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JFUCommonRelationCheck;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0280_FUSV0280OPDBMapper;
import eo.web.webview.mapping.FUSV0281_FUSV0281OPDBMapper;

/**
 * 電話オプションパック申込解約のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW11001SFLogic extends JCCWebBusinessLogic
{
	/** 処理区分 : "1"(申込) */
	private static final String TRAN_DIV_MSKM = "1";
	/** 処理区分 : "2"(解約) */
	private static final String TRAN_DIV_DSL = "2";

	/** 電話オプションパック申込解約（初期表示）マップ */
	private static final String SC_TITLE_FUSV028001CC = "FUSV028001CC";

	/** 電話セレクトオプションパック操作コモンコンポーネント部品マップ */
	private static final String SC_TITLE_FUSV028002CC = "FUSV028002CC";

	/** 料金プラン固定単価（オプション申込料金）一覧照会 */
	private static final String SC_TITLE_FUSV280 = "FUSV028001SC";

	/** サービスID : 電話オプションパック申込解約(初期表示) */
	private static final String SVC_ID_INIT = "FUSV0280";

	/** 申込完了メール 申込：eo光電話パック３（申込） */
	private static final String MSKM_FIN_MAIL_FUW110_1 = "FUW110_1";
	/** 申込完了メール 解約：eo光電話パック３（解約） */
	private static final String MSKM_FIN_MAIL_FUW110_2 = "FUW110_2";
	/** 申込完了メール 申込：eo光電話パック７（申込） */
	private static final String MSKM_FIN_MAIL_FUW110_3 = "FUW110_3";
	/** 申込完了メール 解約：eo光電話パック７（解約） */
	private static final String MSKM_FIN_MAIL_FUW110_4 = "FUW110_4";
	/** 申込完了メール 申込：eo光電話パック３（申込）※割込電話 */
	private static final String MSKM_FIN_MAIL_FUW110_5 = "FUW110_5";
	/** 申込完了メール 申込：eo光電話パック７（申込）※割込電話 */
	private static final String MSKM_FIN_MAIL_FUW110_6 = "FUW110_6";
	/** 申込完了メール 申込：eo光電話パック３（変更） */
	private static final String MSKM_FIN_MAIL_FUW110_7 = "FUW110_7";
	/** 申込完了メール 申込：eo光電話パック３（変更）※割込電話 */
	private static final String MSKM_FIN_MAIL_FUW110_8 = "FUW110_8";
	/** 申込完了メール 申込：eo光電話パック７（変更） */
	private static final String MSKM_FIN_MAIL_FUW110_9 = "FUW110_9";
	/** 申込完了メール 申込：eo光電話パック７（変更）※割込電話 */
	private static final String MSKM_FIN_MAIL_FUW110_10 = "FUW110_10";

	/** 申込完了メールID FUW054 申込（割込電話） */
	private static final String MSKM_COMP_MAIL_ID_FUW054_1 = "FUW054_1";
	/** 申込完了メールID FUW054 申込（複数通話） */
	private static final String MSKM_COMP_MAIL_ID_FUW054_3 = "FUW054_3";
	/** 申込完了メールID FUW055 申込 */
	private static final String MSKM_COMP_MAIL_ID_FUW055_1 = "FUW055_1";
	/** 申込完了メールID FUW056 申込 */
	private static final String MSKM_COMP_MAIL_ID_FUW056_1 = "FUW056_1";
	/** 申込完了メールID FUW057 申込 */
	private static final String MSKM_COMP_MAIL_ID_FUW057_1 = "FUW057_1";
	/** 申込完了メールID FUW058 申込 */
	private static final String MSKM_COMP_MAIL_ID_FUW058_1 = "FUW058_1";
	/** 申込完了メールID FUW059 申込 */
	private static final String MSKM_COMP_MAIL_ID_FUW059_1 = "FUW059_1";
	/** 申込完了メールID FUW060 申込 */
	private static final String MSKM_COMP_MAIL_ID_FUW060_1 = "FUW060_1";

	/** サービスID：電話オプションパック申込解約(申込) */
	private static final String USECASE_ID_FUSV0281 = "FUSV0281";

	/** 共通関連チェックID：電話オプションパック申込解約(オプション申込なし（オプション解約のみ）) */
	private static final String COMMON_REL_CHECK_ID_FUSV0280 = "FUSV0280";
	/** 共通関連チェックID：電話オプションパック申込解約(申込オプションあり) */
	private static final String COMMON_REL_CHECK_ID_FUSV0032 = "FUSV0032";

	/** 料金プラン固定単価（オプション申込料金）一覧照会.料金プラン固定単価（オプション申込料金）明細 */
	private static final String EKK0601B001_LIST = "EKK0601B001CBSMsg1List";
	/** 料金プラン固定金額 */
	private static final String PPLAN_KOTEI_AMNT = "pplan_kotei_amnt";
	/** 料金プラン固定単位コード名 */
	private static final String PPLAN_KOTEI_TANI_CD_NM = "pplan_kotei_tani_cd_nm";

	// webF/prop/FUDispDefinition.xml
	/** 定義取得パス オプション名 */
	private static final String PATH_OPTION_NM = "DISPSETTING/SETTING[@screenId='FUW11001']/DISPTEXT[@groupid='OPTION_NM']";
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";

	// webF/prop/FULinkDefinition.xml
	/** 定義取得パス オプション名 */
	private static final String PATH_OPTION_LINK = "DISPSETTING/SETTING[@screenId='FUW11001']/OUTLINK[@groupid='OPTION_LINK']";

	/** 無効なサービス契約ステータス */
	private static final List<String> SVC_KEI_STAT_MUKO = Arrays.asList(JFUStrConst.CD00037_910, JFUStrConst.CD00037_920);
	/** 無効な割引契約ステータス */
	private static final List<String> WRIV_SVC_KEI_STAT_MUKO = Arrays.asList(JFUStrConst.CD00055_910, JFUStrConst.CD00055_920);

	/** 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 PRGADD_ID_0 = "0";
	/** 特記事項１要素を取得する際のid */
	private static final String PRGADD_ID_1 = "1";
	/** 特記事項１要素を取得する際のid */
	private static final String PRGADD_ID_2 = "2";
	/** 特記事項１要素を取得する際のid */
	private static final String PRGADD_ID_3 = "3";
	/** 進捗特記事項(置き換え文字列1) */
	private static final String TKJK_1 = "%0%";
	/** 進捗特記事項(置き換え文字列1) */
	private static final String TKJK_2 = "%1%";
	/** フォーマット変換（3桁、先頭0埋め） */
	private static final String FORMAT_1 = "%1$03d";

	/**
	 * 初期処理です。
	 *
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{

		// 開始ログ
		DEBUG_LOG.debug("----- init Start  -----");

		// ----------------------------------------------
		// 引継情報の取得
		// ----------------------------------------------
		// メニュー画面より遷移元画面ID・処理区分を引継
		JFUWebCommon.getScreenInfo(this);

		// ----------------------------------------------
		// Bean取得
		// ----------------------------------------------
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = getServiceFormBean();

		//----------------------------------------------
		// 共通関連チェック
		//----------------------------------------------
		// APLConstの設定はNO_CHECK(遷移元：「FUW05301_eo光電話お客さま契約情報変更／照会メニュー」、SSOログイン経由)にし、ここで処理を行う
		JFUWebCommon.checkCommonRelation(this, SVC_ID_INIT);

		//----------------------------------------------
		// 現顧客契約情報最新化
		//----------------------------------------------
		JFUWebCommon.refreshGenCustKei(this);

		// ----------------------------------------------
		// 共有フォームBean情報の取得
		// ----------------------------------------------
		setCommonInfoBeanToSvcFormBean(bean, commonInfoBean);

		//----------------------------------------------
		// サービス呼出処理
		//----------------------------------------------
		HashMap<String, Object> outputMap = callSvcFUSV0280(bean, commonInfoBean);

		// ----------------------------------------------
		// 割引サービス契約のチェック
		// ----------------------------------------------
		checkSvcRsvKei(bean, outputMap);

		// ----------------------------------------------
		// 料金表示の編集
		// ----------------------------------------------
		// ●料金表表示現在日設定処理
		JFUWebCommon.setPrcDspNowDay(this);
		// ●料金表データ作成
		createPriceData(outputMap, bean);
		// ●料金表マッピング
		JFUWebCommon.setPrcInfoArea(bean, outputMap, SC_TITLE_FUSV280, null, JFUScreenConst.SCREEN_ID_FUW11001);

		// ----------------------------------------------
		// オプション表示の編集
		// ----------------------------------------------
		createOptionData(bean, commonInfoBean, outputMap);

		// ----------------------------------------------
		// 遷移先画面の指定
		// ----------------------------------------------
		// 遷移先画面IDを設定（画面機能の先頭になる場合の固定ロジック）
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUWebCommon.getScreenId(this));
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW11001);

		// 終了ログ
		DEBUG_LOG.debug("----- init End  -----");
		return true;
	}

	/**
	 * 申込画面の確認ボタン押下処理です。
	 *
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean cfm() throws Exception
	{
		// 開始ログ
		DEBUG_LOG.debug("----- cfm Start  -----");

		// ----------------------------------------------
		// Bean取得
		// ----------------------------------------------
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = getServiceFormBean();

		String tranDiv = bean.sendMessageString(FUW11001SFConst.TRAN_DIV, GET);

		// ○全解約処理
		if (TRAN_DIV_DSL.equals(tranDiv))
		{
			// 画面用表示リスト(申込データ）
			X31SDataBeanAccessArray dspOptionList = bean.getDataBeanArray(FUW11001SFConst.DSP_OPTION_LIST);
			// 全解約が設定されていないときに、申し込み内容に応じて自動的に設定状態にする。
			if (!bean.sendMessageBoolean(FUW11001SFConst.ALL_DSL, GET))
			{
				// 解約フラグ
				boolean allDsl = true;
				for (int i = 0; i < dspOptionList.getCount(); i++)
				{
					X31SDataBeanAccess dataBean = dspOptionList.getDataBean(i);

					// 非表示の場合はスキップ
					if ("0".equals(dataBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, GET)))
					{
						continue;
					}

					// ●申し込む
					// ※申込データが一つでもあれば、全解約にしない
					if (dataBean.sendMessageBoolean(FUW11001SFConst.MSKM_02, GET))
					{
						allDsl = false;
						break;
					}
					// ●解約する
					// ※契約済み 且つ 解約しないデータが一つでもあれば、全解約にしない。
					if ("1".equals(dataBean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET))
							&& !dataBean.sendMessageBoolean(FUW11001SFConst.DSL_02, GET))
					{
						allDsl = false;
						break;
					}
				}

				// 全解約にtrueを設定する。
				if (allDsl)
				{
					bean.sendMessageBoolean(FUW11001SFConst.ALL_DSL, SET, Boolean.TRUE);
				}

			}
			else
			{
				// 全解約が押下されている場合
				for (int i = 0; i < dspOptionList.getCount(); i++)
				{
					X31SDataBeanAccess dataBean = dspOptionList.getDataBean(i);

					// ●解約すみに設定する
					// ※表示フラグが表示 且つ 契約済みの場合
					if ("1".equals(dataBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, GET))
							&& "1".equals(dataBean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET)))
					{
						dataBean.sendMessageBoolean(FUW11001SFConst.DSL_02, SET, Boolean.TRUE);
					}

					// ●申し込むを未設定にする
					dataBean.sendMessageBoolean(FUW11001SFConst.MSKM_02, SET, Boolean.FALSE);
				}
			}
		}

		// ●OM-2015-0000236の調査用
		// お得判定のチェックをして想定と異なる場合は、BUSログを出力します。
		checkPackData(bean, commonInfoBean);

		// ○確認画面の申込ボタン制御
		// 　全解約時に解約ボタンを表示する。
		if (!bean.sendMessageBoolean(FUW11001SFConst.ALL_DSL, GET))
		{
			bean.sendMessageString(FUW11001SFConst.KKN_BTN_SHOW_FLG, SET, "1"); // "1"：申込
		}
		else
		{
			bean.sendMessageString(FUW11001SFConst.KKN_BTN_SHOW_FLG, SET, "2"); // "2"：解約
		}

		// ○解約する割引サービスコード
		// 契約中の割引サービスコードが存在して、お得判定後の割引サービスコードと異なる場合に、契約中の割引サービスコードを設定する。
		String nowWribSvcCd = bean.sendMessageString(FUW11001SFConst.NOW_WRIB_SVC_CD, GET);
		String otokuWribSvcCd = bean.sendMessageString(FUW11001SFConst.OTOKU_WRIB_SVC_CD, GET);

		if (!JFUWebCommon.isNull(nowWribSvcCd) && !nowWribSvcCd.equals(otokuWribSvcCd))
		{
			bean.sendMessageString(FUW11001SFConst.DSL_WRIB_SVC_CD, SET, nowWribSvcCd);
		}
		else
		{
			bean.sendMessageString(FUW11001SFConst.DSL_WRIB_SVC_CD, SET, JFUStrConst.EMPTY);
		}

		// ●表示フラグの設定
		changeDspFlag(bean, JFUScreenConst.SCREEN_ID_FUW11002);

		// ----------------------------------------------
		// 遷移先画面の指定
		// ----------------------------------------------
		// 遷移先画面IDを設定（画面機能の先頭になる場合の固定ロジック）
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW11002);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW11002);

		// 終了ログ
		DEBUG_LOG.debug("----- cfm End  -----");
		return true;
	}

	/**
	 * 確認画面の解約するボタン押下処理です。
	 *
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean dsl() throws Exception
	{
		// 確認解約処理
		mskm();

		return true;
	}

	/**
	 * 確認画面の申し込むボタン押下処理です。
	 *
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean mskm() throws Exception
	{
		// 開始ログ
		DEBUG_LOG.debug("----- mskm Start  -----");

		// ----------------------------------------------
		// Bean取得
		// ----------------------------------------------
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// ●サービス呼び出し処理
		// Web契約容量追加申込（申込み）サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0281);

		FUSV0281_FUSV0281OPDBMapper mapper = new FUSV0281_FUSV0281OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = { commonInfoBean, bean };

		// オプションパックリスト作成
		ArrayList opPackList = createOpPackList(bean, commonInfoBean);

		// オプションリスト作成と共通関連チェックの実施
		ArrayList opionList = createOpListAndComRelCheck(bean, commonInfoBean);

		// CC
		// 1.eo光電話オプションパック申込登録CC
		dataMap = mapper.setFUSV028101CC(paramBean, dataMap, opPackList, opionList, JPCModelConstant.FUNC_CD_1);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();
		try
		{
			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			handleInitException(se);
		}

		// ●現顧客リフレッシュ処理
		JFUWebCommon.refreshGenCustKei(this);

		// 申込完了メール送信部品呼出処理
		setMskmMailInfo(bean);

		// ----------------------------------------------
		// 遷移先画面の指定
		// ----------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW11003);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW02703);

		// 終了ログ
		DEBUG_LOG.debug("----- mskm End  -----");
		return true;
	}

	/**
	 * 確認画面の戻るボタン押下処理です。
	 *
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean back() throws Exception
	{
		// 開始ログ
		DEBUG_LOG.debug("----- back Start  -----");

		// ----------------------------------------------
		// Bean取得
		// ----------------------------------------------
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// ●表示フラグの設定
		changeDspFlag(bean, JFUScreenConst.SCREEN_ID_FUW11001);

		// ----------------------------------------------
		// 遷移先画面の指定
		// ----------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW11001);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW11001);

		// 終了ログ
		DEBUG_LOG.debug("----- back End  -----");
		return true;
	}

	/**
	 * サービス呼出処理（FUSV0280_電話オプションパック申込解約(初期表示)）
	 * <br>
	 * @param bean
	 * @param commonInfoBean
	 * @return HashMap
	 * @throws Exception
	 */
	private HashMap<String, Object> callSvcFUSV0280(X31SDataBeanAccess bean, X31SDataBeanAccess commonInfoBean) throws Exception
	{
		DEBUG_LOG.info("----- FUW11001 callSvcFUSV0280 Start  -----");

		// パラメータ作成
		X31SDataBeanAccess[] paramBean = { commonInfoBean, bean };

		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SVC_ID_INIT);

		// 設定値格納用マップを生成。
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// DataBean-BPマッピング
		FUSV0280_FUSV0280OPDBMapper mapper = new FUSV0280_FUSV0280OPDBMapper();

		// サービスの入力値設定
		// 機能コード:"1"
		// JFUGetOptPackMskmCC_eo光電話オプションパック申込照会コモンコンポーネント部品
		mapper.setFUSV028001CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		// JKKTelSelectOpPackOperateCC__電話セレクトオプションパック操作コモンコンポーネント部品
		mapper.setFUSV028002CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);

		try
		{
			// サービス呼出
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 初期表示時例外ハンドリング処理
			handleInitException(se);
		}

		// サービスの出力値設定
		mapper.getFUSV028001CC(paramBean, outputMap);

		DEBUG_LOG.info("----- FUW1101 callSvcFUSV0280 End  -----");

		// --------------------------------------------------------------
		// 料金表情報の設定でSC戻り値のMapが必要なため、outputMapを返す。
		// --------------------------------------------------------------
		return outputMap;

	}

	/**
	 * 初期表示時例外ハンドリング処理
	 * <br/>
	 * 初期表示処理時に発生した業務例外のハンドリングを行ないます。
	 *
	 * @param se
	 * @throws Exception
	 */
	private void handleInitException(final JCCWebServiceException se) throws Exception
	{
		DEBUG_LOG.info("----- FUW11001 handleInitException Start  -----");

		// 例外詳細情報を取得
		X31CMessageMoreInfo[] moreInfo = se.getMessageList().getMessageMoreInfoList();
		// メッセージ詳細情報クラスを取得
		// (単項目チェックエラーの発生有無を確認するだけなので、先頭レコードのみ処理する)
		X31CMessageMoreInfo info = moreInfo[0];

		String templateid = info.getTemplateId();
		String itemid = info.getItemId();
		String status = info.getStatus();
		String errFlg = info.getItemCheckErr();

		DEBUG_LOG.info("----- FUW11001 handleInitException End  -----");

		// ○単項目チェックエラー
		// ステータスが"1000"(単項目チェックエラー)の場合
		if (String.valueOf(JPCModelConstant.SINGLEDATA_ERR).equals(status))
		{
			// 画面初期表示時の単項目チェックエラーは、画面上で訂正できない。
			// →フロント共通エラー画面に遷移
			DEBUG_LOG.info("■■■FUW11001 電話オプションパック申込解約：単項目チェックエラー■■■");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
		}

		// ○排他チェック
		// ステータスが"1100"(関連チェックエラー) 且つ 更新年月日時分秒（更新前）の場合
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status) && "upd_dtm_bf".equals(itemid))
		{
			DEBUG_LOG.info("■■■FUW11001 電話オプションパック申込解約：更新不可エラー■■■");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0204); // "0204"：更新不可エラー
		}

		// その他のエラーは入力パラメータに起因しないエラーなので、システムエラー扱いとする。
		DEBUG_LOG.info("■■■FUW11001 電話オプションパック申込解約：システムエラー（単項目チェックエラー以外）■■■");
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002); // "0002"：システムエラー
	}

	/**
	 * 画面表示用の料金表リストデータを作成します。
	 * <br>
	 * @param bean
	 * @param outputMap
	 * @throws Exception
	 */
	private void createPriceData(HashMap<String, Object> outputMap, X31SDataBeanAccess bean) throws Exception
	{

		// 定義を取得
		Map<String, String> optionNmMap = JFUWebCommon.getDispItemsAsMap(PATH_OPTION_NM, QUERY_ATTR_NAME);
		setMultiPhoneName(bean, optionNmMap);

		// ●固定単価
		HashMap<String, ArrayList<HashMap<String, String>>> fusv0133CC1Map =
				(HashMap<String, ArrayList<HashMap<String, String>>>)outputMap.get(SC_TITLE_FUSV028001CC);

		ArrayList<HashMap<String, String>> pplan_kttanka_list = fusv0133CC1Map.get("out_pplan_kttanka_list");

		List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
		for (HashMap<String, String> dataMap : pplan_kttanka_list)
		{
			// 料金表データ作成（後続のJFUWebCommon.setPrcInfoArea()メソッドで使用）
			Map<String, Object> childMap = new HashMap<String, Object>();

			// タイトル(ID,オプションサービス名）
			String pcrsCd = dataMap.get("pcrs_cd");
			String pplanCd = dataMap.get("pplan_cd");
			childMap.put("pplan_kotei_title", "pcrs_" + pcrsCd + "_" + pplanCd + "," + optionNmMap.get(pcrsCd));
			// 料金プラン固定料金
			childMap.put(PPLAN_KOTEI_AMNT, dataMap.get(PPLAN_KOTEI_AMNT));
			// 料金プラン固定単位コード名
			childMap.put(PPLAN_KOTEI_TANI_CD_NM, dataMap.get(PPLAN_KOTEI_TANI_CD_NM));

			dataList.add(childMap);
		}

		// 料金表データ作成（後続のJFUWebCommon.setPrcInfoArea()メソッドで使用）
		Map<String, Object> dataMap = new HashMap<String, Object>();
		dataMap.put(EKK0601B001_LIST, dataList);

		outputMap.put(SC_TITLE_FUSV280, dataMap);

	}

	/**
	 * 画面表示用のオプションリストデータを作成します。
	 * <br>
	 * @param bean
	 * @param commonInfoBean
	 * @param outputMap
	 * @throws Exception
	 */
	private void createOptionData(X31SDataBeanAccess bean, X31SDataBeanAccess commonInfoBean, HashMap outputMap) throws Exception
	{

		// 定義を取得
		Map<String, String> optionNmMap = JFUWebCommon.getDispItemsAsMap(PATH_OPTION_NM, QUERY_ATTR_NAME);
		// 複数通話対応
		setMultiPhoneName(bean, optionNmMap);

		// 定義を取得
		Map<String, String> optionLinkMap = JFUWebCommon.getLinkItemsAsMap(PATH_OPTION_LINK, QUERY_ATTR_NAME);
		// 複数通話対応
		setMultiPhoneLink(bean, optionLinkMap);

		//
		HashMap fusv028001CCMap = (HashMap)outputMap.get(SC_TITLE_FUSV028001CC);

		// 処理区分
		String tranDiv = bean.sendMessageString(FUW11001SFConst.TRAN_DIV, GET);

		// 申込オプションサービスコード
		String mskmOpSvcCd = bean.sendMessageString(FUW11001SFConst.MSKM_OP_SVC_CD, GET);

		// 申込判定用割引サービス構成リストを取得
		ArrayList<HashMap<String, String>> msjWrsksList = (ArrayList)fusv028001CCMap.get("out_msj_wrsks_list");

		// 料金プラン固定単価リストを取得
		ArrayList<HashMap<String, String>> pplanKttankaList = (ArrayList)fusv028001CCMap.get("out_pplan_kttanka_list");

		// 画面用表示リスト(空）
		X31SDataBeanAccessArray dspOptionList = bean.getDataBeanArray(FUW11001SFConst.DSP_OPTION_LIST);

		int countKeiStat = 0;

		for (HashMap<String, String> dataMap : msjWrsksList)
		{
			// サブビーンを作成
			X31SDataBeanAccess subbean = dspOptionList.addDataBean();

			// オプションサービスコード
			String opSvcCd = dataMap.get("op_svc_cd");
			// サブオプションサービスコード
			String sbopSvcCd = dataMap.get("sbop_svc_cd");
			// 料金コースコード
			String pcrsCd = dataMap.get("pcrs_cd");
			// 料金プランコード
			String pplanCd = dataMap.get("pplan_cd");

			// ○オプションサービス名
			// オプション
			if (!JFUWebCommon.isNull(opSvcCd))
			{
				subbean.sendMessageString(FUW11001SFConst.DSP_TEL_OP_NM_02, SET, optionNmMap.get(pcrsCd));
				subbean.sendMessageString(FUW11001SFConst.LINK_TEL_OP_SETMEI_02, SET, optionLinkMap.get("link_" + opSvcCd));
				subbean.sendMessageString(FUW11001SFConst.OP_SVC_CD_02, SET, opSvcCd);

			}
			// サブオプション
			if (!JFUWebCommon.isNull(sbopSvcCd))
			{
				subbean.sendMessageString(FUW11001SFConst.DSP_TEL_OP_NM_02, SET, optionNmMap.get(pcrsCd));
				subbean.sendMessageString(FUW11001SFConst.LINK_TEL_OP_SETMEI_02, SET, optionLinkMap.get("link_" + sbopSvcCd));
				subbean.sendMessageString(FUW11001SFConst.SBOP_SVC_CD_02, SET, sbopSvcCd);
			}
			// ○料金コースコード
			subbean.sendMessageString(FUW11001SFConst.PCRS_CD_02, SET, pcrsCd);
			// ○料金プランコード
			subbean.sendMessageString(FUW11001SFConst.PPLAN_CD_02, SET, pplanCd);

			// ●料金データ追加
			HashMap<String, String> tankaMap = pplanKttankaList.get(0);
			subbean
					.sendMessageString(FUW11001SFConst.OP_PRICE_02, SET, JFUWebCommon
							.getCalcPlanPrcExcludeTax(this, tankaMap.get("pplan_kotei_amnt")));

			// ○割引サービスコードリスト（どの割引に紐づくかを設定）
			subbean.sendMessageString(FUW11001SFConst.WRIB_SVC_CD_LIST_02, SET, dataMap.get("wrib_svc_cd_list"));

			// ●契約データを取得
			X31SDataBeanAccess[] tranTrgtRecOpArray = getTranTrgtRecOp(bean, opSvcCd);
			X31SDataBeanAccess tranTrgtRecOp = null;
			if (tranTrgtRecOpArray.length != 0)
			{
				tranTrgtRecOp = tranTrgtRecOpArray[0];
			}

			// ●契約状態の値を設定
			if (tranTrgtRecOp != null)
			{
				// ○オプションサービス契約番号
				subbean.sendMessageString(FUW11001SFConst.OP_SVC_KEI_NO_02, SET, tranTrgtRecOp.sendMessageString(FUW11001SFConst.OP_SVC_KEI_NO_01,
						GET));
				// ○オプションサービス契約世代登録年月日時分秒
				subbean.sendMessageString(FUW11001SFConst.OPSVKEI_GENE_ADD_DTM_02, SET, tranTrgtRecOp.sendMessageString(
						FUW11001SFConst.KK0351_GENE_ADD_DTM_01, GET));
				// ○サブオプションサービス契約番号
				subbean.sendMessageString(FUW11001SFConst.SBOP_SVC_KEI_NO_02, SET, tranTrgtRecOp.sendMessageString(
						FUW11001SFConst.SBOP_SVC_KEI_NO_01, GET));
				// ○サブオプションサービス契約世代登録年月日時分秒
				subbean.sendMessageString(FUW11001SFConst.SBOPSVKEI_GENE_ADD_DTM_02, SET, tranTrgtRecOp.sendMessageString(
						FUW11001SFConst.KK0401_GENE_ADD_DTM_01, GET));

				// オプションの場合（サブオプションが入っていない場合）はデータを設定
				// サブオプションの場合は、無効なステータス以外で
				// 取得したデータにサブオプションサービスコードが入っていれば、データを設定
				if (JFUWebCommon.isNull(sbopSvcCd)
						|| (!JFUWebCommon.isNull(sbopSvcCd)
								&& !JFUWebCommon.isNull(tranTrgtRecOp.sendMessageString(FUW11001SFConst.SBOP_SVC_CD_01, GET)) && !SVC_KEI_STAT_MUKO
								.contains(tranTrgtRecOp.sendMessageString(FUW11001SFConst.SBOP_SVC_KEI_STAT_01, GET))))
				{

					// ○契約状態
					subbean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, SET, JFUStrConst.CD00002_1);
					// 契約中のオプション件数をカウント
					countKeiStat++;
				}
				else
				{

					// ○契約状態
					subbean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, SET, JFUStrConst.CD00002_0);
				}
			}
			else
			{

				// ○契約状態
				subbean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, SET, JFUStrConst.CD00002_0);
			}

			// ○申し込む
			// 処理区分が"1"：申込 且つ 契約状態が未契約時 場合は、選択状態にする。
			if (TRAN_DIV_MSKM.equals(tranDiv) && JFUStrConst.CD00002_0.equals(subbean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET)))
			{
				subbean.sendMessageBoolean(FUW11001SFConst.MSKM_02, SET, Boolean.TRUE);
// ANK-3763-00-00 ADD START
				// 転送電話の場合は、未選択状態にする。
				if (JFUStrConst.CD00134_B28.equals(pcrsCd))
				{
					subbean.sendMessageBoolean(FUW11001SFConst.MSKM_02, SET, Boolean.FALSE);
					bean.sendMessageString(FUW11001SFConst.TENSOTEL_COMMENT_DSP_FLG, SET, "1");
				}
// ANK-3763-00-00 ADD END
			}
			else
			{
				subbean.sendMessageBoolean(FUW11001SFConst.MSKM_02, SET, Boolean.FALSE);
// ANK-3763-00-00 ADD START
				// 転送電話が未契約時 転送電話の申込可能状態とする。
				if (JFUStrConst.CD00134_B28.equals(pcrsCd) && JFUStrConst.CD00002_0.equals(subbean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET)))
				{
					bean.sendMessageString(FUW11001SFConst.TENSOTEL_COMMENT_DSP_FLG, SET, "1");
				}
// ANK-3763-00-00 ADD END
			}

			// ○解約する
			subbean.sendMessageBoolean(FUW11001SFConst.DSL_02, SET, Boolean.FALSE);
			// 処理区分が"2"：解約の場合は、個別オプションから遷移時は、そのオプションを選択状態にする。
			// ※契約状態が契約時の場合のみ
			if (TRAN_DIV_DSL.equals(tranDiv) && JFUStrConst.CD00002_1.equals(subbean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET)))
			{
				if ((!JFUWebCommon.isNull(opSvcCd) && opSvcCd.equals(mskmOpSvcCd))
						|| (!JFUWebCommon.isNull(sbopSvcCd) && sbopSvcCd.equals(mskmOpSvcCd)))
				{
					subbean.sendMessageBoolean(FUW11001SFConst.DSL_02, SET, Boolean.TRUE);
				}
			}
		}

		// ----------------------------------------------
		// 督促チェック
		// ----------------------------------------------
		checkTokusokuStat(commonInfoBean, bean);

		// 督促エラー有無
		String tokusokuErrUm = bean.sendMessageString(FUW11001SFConst.TOKUSOKU_ERR_UM, GET);
		if (TRAN_DIV_MSKM.equals(tranDiv) && countKeiStat == 0 && JFUStrConst.CD00002_1.equals(tokusokuErrUm))
		{
			// 処理区分が「1:申込」で且つオプションの契約件数が0件で且つ督促状態エラーの場合（画面での申し込みができない場合）

			DEBUG_LOG.info("■■■FUW11001 電話オプションパック申込解約：督促状態エラー■■■");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0104); // "0104"：契約状態エラー
		}

		// ●表示フラグの設定
		changeDspFlag(bean, JFUScreenConst.SCREEN_ID_FUW11001);

		// ○契約中料金プランコードリスト
		bean.sendMessageString(FUW11001SFConst.NOW_PPLAN_CD_LIST, SET, getNowPplanCdList(dspOptionList));

	}

	/**
	 * 複数通話の名称を割込電話の名称に上書き設定
	 * <br>
	 * @param bean
	 * @param optionNmMap
	 */
	private void setMultiPhoneName(X31SDataBeanAccess bean, Map<String, String> optionNmMap)
	{
		String multiPhone = bean.sendMessageString(FUW11001SFConst.MULTI_PHONE_CALL_FLG, GET);
		if ("1".equals(multiPhone))
		{
			// 複数通話の名称を割引電話に上書き
			optionNmMap.put("B27", optionNmMap.get("B27_M"));
		}
	}

	/**
	 * 複数通話のリンクを割込電話のリンクに上書き設定
	 * <br>
	 * @param bean
	 * @param optionNmMap
	 */
	private void setMultiPhoneLink(X31SDataBeanAccess bean, Map<String, String> optionLinkMap)
	{
		String multiPhone = bean.sendMessageString(FUW11001SFConst.MULTI_PHONE_CALL_FLG, GET);
		if ("1".equals(multiPhone))
		{
			// 複数通話のリンクを割引電話に上書き
			optionLinkMap.put("link_B023", optionLinkMap.get("link_B023_M"));
		}
	}

	/**
	 * 処理対象レコード抽出
	 * <br>
	 * @param bean
	 * @param opSvcCd
	 * @return	X31SDataBeanAccess[]
	 * @throws Exception
	 */
	private X31SDataBeanAccess[] getTranTrgtRecOp(X31SDataBeanAccess bean, String opSvcCd) throws Exception
	{
		DEBUG_LOG.info("----- FUW11001 getTranTrgtRecOp Start  -----");

		//----------------------------------------------------------------------------------
		// オプションサービスコード(op_svc_cd)が一致するレコードを抽出
		//----------------------------------------------------------------------------------
		Map<String, String> condition = new HashMap<String, String>();

		condition.put(FUW11001SFConst.OP_SVC_CD_01, opSvcCd);
		X31SDataBeanAccess[] beans = JFUWebCommon.getDataBeanListByPathWithKey(bean, FUW11001SFConst.SVC_KEI_INFO_LIST, condition);

		DEBUG_LOG.info("----- FUW11001 getTranTrgtRecOp End  -----");

		return beans;
	}

	/**
	 * 申込完了メールの設定値を設定します。
	 * <br>
	 * @param bean
	 * @throws Exception
	 */
	private void setMskmMailInfo(X31SDataBeanAccess bean) throws Exception
	{
		// 契約中の割引サービスコード
		String nowWribSvcCd = JFUWebCommon.getDataBeanItemByPath(bean, FUW11001SFConst.NOW_WRIB_SVC_CD);
		// お得判定後の割引サービスコード
		String otokuWribSvcCd = JFUWebCommon.getDataBeanItemByPath(bean, FUW11001SFConst.OTOKU_WRIB_SVC_CD);
		// 複数通話フラグ
		String multiPhoneCallFlg = JFUWebCommon.getDataBeanItemByPath(bean, FUW11001SFConst.MULTI_PHONE_CALL_FLG);

		// パックの申込完了メール
		// ※契約中のパックとことなるパックがつく場合（契約中のパックがない場合も含む）
		// 　お得判定後のパックの申込完了メールを送信する。
		if (!JFUWebCommon.isNull(otokuWribSvcCd) && !nowWribSvcCd.equals(otokuWribSvcCd))
		{
			// パック３の場合
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK3.equals(otokuWribSvcCd))
			{
				if ("1".equals(multiPhoneCallFlg))
				{
					// 複数通話
					// 申込完了メール送信部品呼出処理
					JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW110_1);
				}
				else
				{
					// 割込電話
					// 申込完了メール送信部品呼出処理
					JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW110_5);
				}
			}
			// パック７の場合
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK7.equals(otokuWribSvcCd))
			{
				if ("1".equals(multiPhoneCallFlg))
				{
					// 複数通話
					// 申込完了メール送信部品呼出処理
					JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW110_3);
				}
				else
				{
					// 割込電話
					// 申込完了メール送信部品呼出処理
					JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW110_6);
				}
			}
		}

		// パックの解約完了メール
		// ※契約中のパックがあって、パックがつかなくなる場合
		// 　契約中のパックの解約完了メールを送信する。
		if (!JFUWebCommon.isNull(nowWribSvcCd) && JFUWebCommon.isNull(otokuWribSvcCd))
		{
			// パック３の場合
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK3.equals(nowWribSvcCd))
			{
				// 申込完了メール送信部品呼出処理
				JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW110_2);
			}
			// パック７の場合
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK7.equals(nowWribSvcCd))
			{
				// 申込完了メール送信部品呼出処理
				JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW110_4);
			}
		}

		// パックの変更がない場合の完了メール
		// ※契約中のパックがあって、パックの変更がない場合
		if (!JFUWebCommon.isNull(nowWribSvcCd) && !JFUWebCommon.isNull(otokuWribSvcCd) && nowWribSvcCd.equals(otokuWribSvcCd))
		{
			// パック３の場合
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK3.equals(otokuWribSvcCd))
			{
				if ("1".equals(multiPhoneCallFlg))
				{
					// 複数通話
					// 申込完了メール送信部品呼出処理
					JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW110_7);
				}
				else
				{
					// 割込電話
					// 申込完了メール送信部品呼出処理
					JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW110_8);
				}
			}
			// パック７の場合
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK7.equals(otokuWribSvcCd))
			{
				if ("1".equals(multiPhoneCallFlg))
				{
					// 複数通話
					// 申込完了メール送信部品呼出処理
					JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW110_9);
				}
				else
				{
					// 割込電話
					// 申込完了メール送信部品呼出処理
					JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW110_10);
				}
			}
		}

		// 個別オプション（パックの申込がない）場合の完了メール
		// ※契約中のパックがなくて、パックの申込がない場合
		// ※解約は、パックを持っている場合しかできないので、いらない。
		// 画面用表示リスト(申込データ）
		X31SDataBeanAccessArray dspOptionList = bean.getDataBeanArray(FUW11001SFConst.DSP_OPTION_LIST);
		if (JFUWebCommon.isNull(nowWribSvcCd) && JFUWebCommon.isNull(otokuWribSvcCd))
		{

			for (int i = 0; i < dspOptionList.getCount(); i++)
			{

				X31SDataBeanAccess optionData = dspOptionList.getDataBean(i);

				// 非表示の場合はスキップ
				if ("0".equals(optionData.sendMessageString(FUW11001SFConst.DSP_FLAG_02, GET)))
				{
					continue;
				}

				// オプションサービスコード
				String opCd = optionData.sendMessageString(FUW11001SFConst.OP_SVC_CD_02, GET);
				// サブオプションサービスコード
				String sbopCd = optionData.sendMessageString(FUW11001SFConst.SBOP_SVC_CD_02, GET);
				// 申込の場合
				if (optionData.sendMessageBoolean(FUW11001SFConst.MSKM_02, GET))
				{
					if (JFUStrConst.CD00136_B023.equals(opCd) && JFUWebCommon.isNull(sbopCd))
					{
						if ("1".equals(multiPhoneCallFlg))
						{
							// 複数通話
							// 申込完了メール送信部品呼出処理
							JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID_FUW054_3);
						}
						else
						{
							// 割込電話
							// 申込完了メール送信部品呼出処理
							JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID_FUW054_1);
						}
					}
					else if (JFUStrConst.CD00136_B024.equals(opCd) && JFUWebCommon.isNull(sbopCd))
					{
						// 転送電話
						// 申込完了メール送信部品呼出処理
						JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID_FUW055_1);
					}
					else if (JFUStrConst.CD00137_D07.equals(sbopCd))
					{
						// 転送電話選択
						// 申込完了メール送信部品呼出処理
						JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID_FUW056_1);
					}
					else if (JFUStrConst.CD00136_B025.equals(opCd) && JFUWebCommon.isNull(sbopCd))
					{
						// 発信者番号表示
						// 申込完了メール送信部品呼出処理
						JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID_FUW057_1);
					}
					else if (JFUStrConst.CD00137_D08.equals(sbopCd))
					{
						// 非通知着信拒否
						// 申込完了メール送信部品呼出処理
						JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID_FUW058_1);
					}
					else if (JFUStrConst.CD00136_B026.equals(opCd) && JFUWebCommon.isNull(sbopCd))
					{
						// 迷惑電話拒否
						// 申込完了メール送信部品呼出処理
						JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID_FUW059_1);
					}
					else if (JFUStrConst.CD00136_B027.equals(opCd) && JFUWebCommon.isNull(sbopCd))
					{
						// 指定番号着信選択
						// 申込完了メール送信部品呼出処理
						JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID_FUW060_1);
					}
				}

			}
		}

	}

	/**
	 * 共有フォームBean情報の取得(サービスフォームBeanに設定)
	 * <br>
	 * @param bean
	 * @param commonInfoBean
	 * @throws Exception
	 */
	private void setCommonInfoBeanToSvcFormBean(X31SDataBeanAccess bean, X31SDataBeanAccess commonInfoBean) throws Exception
	{
		DEBUG_LOG.info("----- FUW11001 setCommonInfoBeanToSvcFormBean Start  -----");

		// 共通フォームBean/ＷＥＢ変更情報/0/現顧客契約情報/0/サービス契約情報/0
		X31SDataBeanAccess svcKeiInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);

		// SYSID	← 共有フォームBean.ＷＥＢ変更情報.ＳＳＯ情報.ＳＹＳＩＤ(sysid)
		JFUWebCommon.setDataBeanItemByPath(bean, FUW11001SFConst.SYSID, JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SSO_INFO
				+ JFUWebCommon.SEP_0 + CommonInfoCFConst.SYSID_21));

		// サービス契約番号	← 共有フォームBean.ＷＥＢ変更情報.ＳＳＯ情報.サービス契約番号(svc_kei_no)
		JFUWebCommon.setDataBeanItemByPath(bean, FUW11001SFConst.SVC_KEI_NO, JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SSO_INFO
				+ JFUWebCommon.SEP_0 + CommonInfoCFConst.SVC_KEI_NO_21));

		// 電話番号	← 共有フォームBean.ＷＥＢ変更情報.ＳＳＯ情報.電話番号
		JFUWebCommon.setDataBeanItemByPath(bean, FUW11001SFConst.TELNO, JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SSO_INFO
				+ JFUWebCommon.SEP_0 + CommonInfoCFConst.TELNO_21));

		// 請求契約番号	← 共有フォームBean.ＷＥＢ変更情報.現顧客契約情報.サービス契約情報.請求契約情報.請求契約番号(seiky_kei_no)
		JFUWebCommon.setDataBeanItemByPath(bean, FUW11001SFConst.SEIKY_KEI_NO, JFUWebCommon.getDataBeanItemByPath(commonInfoBean,
				JFUWebCommon.SEIKY_KEI_INFO + JFUWebCommon.SEP_0 + CommonInfoCFConst.SEIKY_KEI_NO_32));

		// 最終更新年月日時分秒(サービス契約)	← 共有フォームBean.ＷＥＢ変更情報.現顧客契約情報.サービス契約情報.最終更新年月日時分秒(last_upd_dtm)
		JFUWebCommon.setDataBeanItemByPath(bean, FUW11001SFConst.KK0081_UPD_DTM_BF, JFUWebCommon.getDataBeanItemByPath(commonInfoBean,
				JFUWebCommon.SVC_KEI_INFO + JFUWebCommon.SEP_0 + CommonInfoCFConst.LAST_UPD_DTM_23));

		// ○サービス契約回線内訳番号
		String svcKeiKaisenUcwkNo = null;
		// 共通フォームBean/ＷＥＢ変更情報/0/現顧客契約情報/0/サービス契約情報/0/サービス契約回線内訳情報/0
		X31SDataBeanAccessArray svcKeiKaisenUcwkInfoList = svcKeiInfo.getDataBeanArray(CommonInfoCFConst.SVC_KEI_KAISEN_UCWK_INFO);
		for (int i = 0; i < svcKeiKaisenUcwkInfoList.getCount(); i++)
		{
			X31SDataBeanAccess svcKeiUcwkKaisenInfoBean = svcKeiKaisenUcwkInfoList.getDataBean(i);

			// サービス契約内訳ステータス
			String svcKeiKaisenUcwkStat = svcKeiUcwkKaisenInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_KAISEN_UCWK_STAT_26, GET);

			// 解約・キャンセル時は、スキップ
			if (SVC_KEI_STAT_MUKO.contains(svcKeiKaisenUcwkStat))
			{
				continue;
			}

			// サービス契約回線内訳番号
			svcKeiKaisenUcwkNo = svcKeiUcwkKaisenInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_KAISEN_UCWK_NO_26, GET);
		}
		// サービス契約回線内訳番号
		JFUWebCommon.setDataBeanItemByPath(bean, FUW11001SFConst.SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUcwkNo);

		// ○サービス契約内訳番号
		String svcKeiUcwkNo = null;
		// 共通フォームBean/ＷＥＢ変更情報/0/現顧客契約情報/0/サービス契約情報/0/サービス契約内訳情報/0
		X31SDataBeanAccessArray svcKeiUcwkInfoList = svcKeiInfo.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO);
		for (int i = 0; i < svcKeiUcwkInfoList.getCount(); i++)
		{
			X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiUcwkInfoList.getDataBean(i);

			// サービス契約内訳ステータス
			String svcKeiUcwkStat = svcKeiUcwkInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_STAT_24, GET);
			// 電話番号
			String telno = svcKeiUcwkInfoBean.sendMessageString(CommonInfoCFConst.TELNO_24, GET);

			// 解約・キャンセル時は、スキップ
			if (SVC_KEI_STAT_MUKO.contains(svcKeiUcwkStat))
			{
				continue;
			}
			// 電話番号が異なる場合は、スキップ
			if (!telno.equals(bean.sendMessageString(FUW11001SFConst.TELNO, GET)))
			{
				continue;
			}

			// サービス契約内訳番号
			svcKeiUcwkNo = svcKeiUcwkInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_NO_24, GET);
		}
		// サービス契約内訳番号
		JFUWebCommon.setDataBeanItemByPath(bean, FUW11001SFConst.SVC_KEI_UCWK_NO, svcKeiUcwkNo);

		DEBUG_LOG.info("----- FUW11001 setCommonInfoBeanToSvcFormBean End  -----");
	}

	/**
	 * パックリストの作成（登録用）
	 * <br>
	 * @param bean
	 * @param commBean
	 * @return ArrayList
	 */
	private ArrayList createOpPackList(X31SDataBeanAccess bean, X31SDataBeanAccess commBean)
	{
		// パックの契約が変更される場合のみ設定する。
		// 　次の３パターンのいづれか。パックの登録、パックの付け替え、パックの削除
		// パックの付け替えが発生する場合に２件データを作成する。

		ArrayList<HashMap> opPackList = new ArrayList<HashMap>();

		// 契約中の割引サービスコード
		String nowWribSvcCd = bean.sendMessageString(FUW11001SFConst.NOW_WRIB_SVC_CD, GET);
		// お得判定後の割引サービスコード（実際申込されるパック）
		String otokuWribSvcCd = bean.sendMessageString(FUW11001SFConst.OTOKU_WRIB_SVC_CD, GET);

		// ○削除用パックデータ
		// 契約中の割引サービスコードがNULL以外
		// 且つ契約中の割引サービスコードとお得判定後の割引サービスコードが異なる場合
		if (!JFUWebCommon.isNull(nowWribSvcCd) && !nowWribSvcCd.equals(otokuWribSvcCd))
		{
			HashMap<String, String> opPackMap = new HashMap<String, String>();

			// 処理区分
			opPackMap.put("trn_div", "02"); // "02"：解約
			// SYSID
			opPackMap.put("sysid", bean.sendMessageString(FUW11001SFConst.SYSID, GET));
			// サービス契約番号
			opPackMap.put("svc_kei_no", bean.sendMessageString(FUW11001SFConst.SVC_KEI_NO, GET));
			// サービス契約内訳番号
			opPackMap.put("svc_kei_ucwk_no", bean.sendMessageString(FUW11001SFConst.SVC_KEI_UCWK_NO, GET));
			// 請求契約番号
			opPackMap.put("seiky_kei_no", bean.sendMessageString(FUW11001SFConst.SEIKY_KEI_NO, GET));
			// 進捗特記事項1 例＞ "電話番号：0663202100△eo光電話パック３登録△利用開始日：2014/04/03"
			opPackMap.put("prg_tkjk_1", getPackPrgTkjk1(nowWribSvcCd, bean.sendMessageString(FUW11001SFConst.TELNO, GET), "02"));
			// パック割区分
			String packDiv = "";
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK3.equals(nowWribSvcCd))
			{
				packDiv = "1";
			}
			else if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK7.equals(nowWribSvcCd))
			{
				packDiv = "2";
			}
			opPackMap.put("pack_div", packDiv);

			opPackList.add(opPackMap);
		}

		// ○登録用パックデータ
		// 全解約以外
		// @契約中の割引サービスコードがNULL
		// 　且つお得判定後の割引サービスコードがNULL以外の場合
		// A契約中の割引サービスコードがNULL以外
		// 　且つお得判定後の割引サービスコードがNULL以外
		// 　且つ契約中の割引サービスコードとお得判定後の割引サービスコードが異なる場合
		if (!bean.sendMessageBoolean(FUW11001SFConst.ALL_DSL, GET))
		{
			if ((JFUWebCommon.isNull(nowWribSvcCd) && !JFUWebCommon.isNull(otokuWribSvcCd))
					|| (!JFUWebCommon.isNull(nowWribSvcCd) && !JFUWebCommon.isNull(otokuWribSvcCd) && !nowWribSvcCd.equals(otokuWribSvcCd)))
			{
				HashMap<String, String> opPackMap = new HashMap<String, String>();

				// 処理区分
				opPackMap.put("trn_div", "01"); // "01"：登録
				// SYSID
				opPackMap.put("sysid", bean.sendMessageString(FUW11001SFConst.SYSID, GET));
				// サービス契約番号
				opPackMap.put("svc_kei_no", bean.sendMessageString(FUW11001SFConst.SVC_KEI_NO, GET));
				// サービス契約内訳番号
				opPackMap.put("svc_kei_ucwk_no", bean.sendMessageString(FUW11001SFConst.SVC_KEI_UCWK_NO, GET));
				// 請求契約番号
				opPackMap.put("seiky_kei_no", bean.sendMessageString(FUW11001SFConst.SEIKY_KEI_NO, GET));
				// 進捗特記事項1 例＞ "電話番号：0663202100△eo光電話パック３登録△利用開始日：2014/04/03"
				opPackMap.put("prg_tkjk_1", getPackPrgTkjk1(otokuWribSvcCd, bean.sendMessageString(FUW11001SFConst.TELNO, GET), "01"));
				// パック割区分
				String packDiv = "";
				if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK3.equals(otokuWribSvcCd))
				{
					packDiv = "1";
				}
				else if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK7.equals(otokuWribSvcCd))
				{
					packDiv = "2";
				}
				opPackMap.put("pack_div", packDiv);

				opPackList.add(opPackMap);
			}
		}
		return opPackList;
	}

	/**
	 * オプションリストの作成（登録用）と共通関連チェックを実施する。
	 * <br>
	 * @param bean
	 * @param commBean
	 * @return ArrayList
	 * @throws Exception
	 */
	private ArrayList createOpListAndComRelCheck(X31SDataBeanAccess bean, X31SDataBeanAccess commBean) throws Exception
	{
		ArrayList optionList = new ArrayList();

		// 表示用オプション
		X31SDataBeanAccessArray inputList = bean.getDataBeanArray(FUW11001SFConst.DSP_OPTION_LIST);

		int countMskmKbn = 0;
		for (int i = 0; i < inputList.getCount(); i++)
		{
			// 表示用オプションの取得
			X31SDataBeanAccess inputBean = inputList.getDataBean(i);

			HashMap<String, String> optionMap = new HashMap<String, String>();

			// 表示フラグが表示、かつ、選択がない場合はスキップ
			if ("1".equals(inputBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, GET))
					&& !inputBean.sendMessageBoolean(FUW11001SFConst.MSKM_02, GET) && !inputBean.sendMessageBoolean(FUW11001SFConst.DSL_02, GET))
			{
				continue;
			}

			// 表示フラグが非表示、かつ、未契約の場合はスキップ
			if ("0".equals(inputBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, GET))
					&& "0".equals(inputBean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET)))
			{
				continue;
			}

			// 申込区分
			String mskmKbn = "";
			// 申込選択時 且つ、表示フラグが表示の場合
			if (inputBean.sendMessageBoolean(FUW11001SFConst.MSKM_02, GET)
					&& "1".equals(inputBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, GET)))
			{
				mskmKbn = "1"; // "1"：申込
				countMskmKbn++;
			}
			// 解約選択時　または、(契約中 且つ 表示フラグが非表示)の場合
			if (inputBean.sendMessageBoolean(FUW11001SFConst.DSL_02, GET)
					|| ("1".equals(inputBean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET)) && "0".equals(inputBean.sendMessageString(
							FUW11001SFConst.DSP_FLAG_02, GET))))
			{
				mskmKbn = "2"; // "2"：解約
			}
			optionMap.put("mskm_div", mskmKbn);

			// オプションサブオプション
			String svcDiv = "";
			// サブオプション時
			// サブオプションコードがあればサブオプションと判断する。
			if (!JFUWebCommon.isNull(inputBean.sendMessageString(FUW11001SFConst.SBOP_SVC_CD_02, GET)))
			{
				svcDiv = "2";
			}
			// オプション時
			else
			{
				svcDiv = "1";
			}
			optionMap.put("svc_div", svcDiv);

			// SYSID
			optionMap.put("sysid", bean.sendMessageString(FUW11001SFConst.SYSID, GET));
			// 請求契約番号
			optionMap.put("seiky_kei_no", bean.sendMessageString(FUW11001SFConst.SEIKY_KEI_NO, GET));
			// サービス契約番号
			optionMap.put("svc_kei_no", bean.sendMessageString(FUW11001SFConst.SVC_KEI_NO, GET));
			// サービス契約内訳番号
			optionMap.put("svc_kei_ucwk_no", bean.sendMessageString(FUW11001SFConst.SVC_KEI_UCWK_NO, GET));
			// サービス契約回線内訳番号
			optionMap.put("svc_kei_kaisen_ucwk_no", bean.sendMessageString(FUW11001SFConst.SVC_KEI_KAISEN_UCWK_NO, GET));
			// オプションサービス契約番号
			optionMap.put("op_svc_kei_no", inputBean.sendMessageString(FUW11001SFConst.OP_SVC_KEI_NO_02, GET));
			// サブオプションサービス契約番号
			// ※サブオプションの場合のみ設定する。
			if ("2".equals(svcDiv))
			{
				optionMap.put("sbop_svc_kei_no", inputBean.sendMessageString(FUW11001SFConst.SBOP_SVC_KEI_NO_02, GET));
			}
			else
			{
				optionMap.put("sbop_svc_kei_no", JFUStrConst.EMPTY);
			}

			// 進捗特記事項1
			optionMap.put("prg_tkjk_1", getOptionPrgTkjk1(getTelNoJun(commBean), inputBean.sendMessageString(FUW11001SFConst.OP_SVC_CD_02, GET),
					inputBean.sendMessageString(FUW11001SFConst.SBOP_SVC_CD_02, GET), mskmKbn, bean.sendMessageString(
							FUW11001SFConst.MULTI_PHONE_CALL_FLG, GET)));

			// オプションサービスコード
			optionMap.put("op_svc_cd", inputBean.sendMessageString(FUW11001SFConst.OP_SVC_CD_02, GET));
			// サブオプションサービスコード
			optionMap.put("sbop_svc_cd", inputBean.sendMessageString(FUW11001SFConst.SBOP_SVC_CD_02, GET));
			// 料金コースコード
			optionMap.put("pcrs_cd", inputBean.sendMessageString(FUW11001SFConst.PCRS_CD_02, GET));
			// 料金プランコード
			optionMap.put("pplan_cd", inputBean.sendMessageString(FUW11001SFConst.PPLAN_CD_02, GET));

			// SOD用
			// 変更後サービス契約内訳世代登録年月日時分秒
			optionMap.put("chaf_svc_kei_ucwk_gene_add_dtm", getSvcKeiUcwkNoGeneAddDtm(commBean));
			// 変更前オプションサービス契約番号
			optionMap.put("chbf_opsvkei_no", inputBean.sendMessageString(FUW11001SFConst.OP_SVC_KEI_NO_02, GET));
			// 変更前オプションサービス契約世代登録年月日時分秒(オプションサービス契約)
			optionMap.put("chbf_opsvkei_gene_add_dtm", inputBean.sendMessageString(FUW11001SFConst.OPSVKEI_GENE_ADD_DTM_02, GET));
			// 変更前サブオプションサービス契約番号
			optionMap.put("chbf_sbopsvkei_no", inputBean.sendMessageString(FUW11001SFConst.SBOP_SVC_KEI_NO_02, GET));
			// 変更前サブオプションサービス契約世代登録年月日時分秒
			optionMap.put("chbf_sbopsvkei_gene_add_dtm", inputBean.sendMessageString(FUW11001SFConst.SBOPSVKEI_GENE_ADD_DTM_02, GET));

			// ※とりあえず更新後に同じものを設定しておく。
			// 変更後オプションサービス契約番号
			optionMap.put("chaf_opsvkei_no", inputBean.sendMessageString(FUW11001SFConst.OP_SVC_KEI_NO_02, GET));
			// 変更後オプションサービス契約世代登録年月日時分秒(オプションサービス契約)
			optionMap.put("chaf_opsvkei_gene_add_dtm", inputBean.sendMessageString(FUW11001SFConst.OPSVKEI_GENE_ADD_DTM_02, GET));
			// 変更後サブオプションサービス契約番号
			optionMap.put("chaf_sbopsvkei_no", inputBean.sendMessageString(FUW11001SFConst.SBOP_SVC_KEI_NO_02, GET));
			// 変更後サブオプションサービス契約世代登録年月日時分秒
			optionMap.put("chaf_sbopsvkei_gene_add_dtm", inputBean.sendMessageString(FUW11001SFConst.SBOPSVKEI_GENE_ADD_DTM_02, GET));

			optionList.add(optionMap);
		}

		try
		{
			if (countMskmKbn == 0)
			{
				// 「申し込む」オプションがなく、かつ「解約する」オプションのみ

				// ●共通関連チェックの呼び出し処理
				JFUCommonRelationCheck.checkCommonRelation(this, COMMON_REL_CHECK_ID_FUSV0280);
			}
			else
			{
				// 上記以外（「申し込む」のオプションが1件でも含まれる場合）

				// ●共通関連チェックの呼び出し処理
				JFUCommonRelationCheck.checkCommonRelation(this, COMMON_REL_CHECK_ID_FUSV0032);
			}
		}
		catch (JCCWebServiceException se)
		{
			handleInitException(se);
		}

		return optionList;
	}

	/**
	 * パック用の特記事項１要素の取得
	 * <br>
	 * @param wribSvcCd
	 * @param telNo
	 * @param mskmDiv
	 * @return String
	 */
	String getPackPrgTkjk1(String wribSvcCd, String telNo, String mskmDiv)
	{

		String prgTkjk1 = JFUStrConst.EMPTY;

		try
		{
			// パック３ 申込
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK3.equals(wribSvcCd) && "01".equals(mskmDiv))
			{
				prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW11001, PRGADD_ID_0);
			}
			// パック３ 解約
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK3.equals(wribSvcCd) && "02".equals(mskmDiv))
			{
				prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW11001, PRGADD_ID_1);
			}
			// パック７ 申込
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK7.equals(wribSvcCd) && "01".equals(mskmDiv))
			{
				prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW11001, PRGADD_ID_2);
			}
			// パック７ 解約
			if (JFUStrConst.KK0841_WRIB_SVC_CD_TEL_OP_PACK7.equals(wribSvcCd) && "02".equals(mskmDiv))
			{
				prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW11001, PRGADD_ID_3);
			}

			// 電話番号設定
			prgTkjk1 = prgTkjk1.replace(TKJK_1, telNo);
			// 運用日設定
			prgTkjk1 = prgTkjk1.replace(TKJK_2, JFUWebCommon.getOpeDate(this, null));

			if (JFUWebCommon.isNull(prgTkjk1))
			{
				DEBUG_LOG.debug("※進捗特記事項1がXMLから正常に取得できませんでした。処理は続行します。");
			}
		}
		catch (Exception e)
		{
			DEBUG_LOG.debug("※進捗特記事項1がXMLから正常に取得できませんでした。処理は続行します。");
		}

		return prgTkjk1;
	}

	/**
	 * 個別オプション用の特記事項１要素の取得
	 * <br>
	 * @param telNoJun
	 * @param oSvcCd
	 * @param sbopSvcCd
	 * @param mskmKbn
	 * @return String
	 */
	String getOptionPrgTkjk1(String telNoJun, String oSvcCd, String sbopSvcCd, String mskmKbn, String multiPhoneFlg)
	{

		String prgTkjk1 = JFUStrConst.EMPTY;

		try
		{
			String prgaddId = null;
			String prgaddIdM = null; // 複数通話用

			if ("1".equals(mskmKbn))
			{
				// 申込時
				prgaddId = PRGADD_ID_0;
				prgaddIdM = PRGADD_ID_2; // 複数通話用
			}
			else
			{
				// 解約時
				prgaddId = PRGADD_ID_1;
				prgaddIdM = PRGADD_ID_3; // 複数通話用
			}

			if (JFUStrConst.CD00136_B023.equals(oSvcCd))
			{
				if ("1".equals(multiPhoneFlg))
				{
					// 複数通話
					prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW05402, prgaddIdM);
				}
				else
				{
					//割込電話
					prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW05402, prgaddId);
				}
			}
			else if (JFUStrConst.CD00136_B024.equals(oSvcCd))
			{
				if (JFUStrConst.CD00137_D07.equals(sbopSvcCd))
				{
					// 転送電話選択(転送電話のサブ)
					prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW05602, prgaddId);
				}
				else
				{
					//転送電話
					prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW05502, prgaddId);
				}
			}
			else if (JFUStrConst.CD00136_B025.equals(oSvcCd))//発信者番号表示
			{
				if (JFUStrConst.CD00137_D08.equals(sbopSvcCd))
				{
					// 非通知着信拒否(発信者番号表示のサブ)
					prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW05802, prgaddId);
				}
				else
				{
					//発信者番号表示
					prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW05702, prgaddId);
				}
			}
			else if (JFUStrConst.CD00136_B026.equals(oSvcCd))
			{
				//迷惑電話拒否
				prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW05902, prgaddId);
			}
			else if (JFUStrConst.CD00136_B027.equals(oSvcCd))
			{
				//指定番号着信選択
				prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW06002, prgaddId);
			}

			// 電話番号順を追加
			prgTkjk1 = prgTkjk1.replace(TKJK_1, telNoJun);
			prgTkjk1 = prgTkjk1.replace(TKJK_2, telNoJun);

			if (JFUWebCommon.isNull(prgTkjk1))
			{
				DEBUG_LOG.debug("※進捗特記事項1がXMLから正常に取得できませんでした。処理は続行します。");
			}
		}
		catch (Exception e)
		{
			DEBUG_LOG.debug("※進捗特記事項1がXMLから正常に取得できませんでした。処理は続行します。");
		}

		return prgTkjk1;
	}

	/**
	 * 電話番号順の取得
	 * <br>
	 * @param commBean
	 * @return String
	 */
	String getTelNoJun(X31SDataBeanAccess commBean)
	{
		// WEB変更情報
		X31SDataBeanAccess webChgInfoBean = commBean.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);
		// ○サービス契約内訳情報
		X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO).getDataBean(0);

		String telNoJun = svcKeiUcwkInfoBean.sendMessageString(CommonInfoCFConst.TELNO_JUN_24, GET);//電話番号順
		telNoJun = String.format(FORMAT_1, Integer.parseInt(telNoJun));

		return telNoJun;
	}

	/**
	 * 料金プランのコードリストの作成
	 * <br>
	 * @param dspOptionList
	 * @return String
	 */
	String getNowPplanCdList(X31SDataBeanAccessArray dspOptionList)
	{
		ArrayList nowPplanCdList = new ArrayList();

		for (int i = 0; i < dspOptionList.getCount(); i++)
		{
			// サブビーンを作成
			X31SDataBeanAccess subbean = dspOptionList.getDataBean(i);

			// 非表示 または、未契約の場合は、スキップ
			if ("0".equals(subbean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, GET))
					|| JFUStrConst.CD00002_0.equals(subbean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET)))
			{
				continue;
			}

			// リストに追加
			nowPplanCdList.add(subbean.sendMessageString(FUW11001SFConst.PCRS_CD_02, GET) + JFUStrConst.HALF_UNDER_BAR
					+ subbean.sendMessageString(FUW11001SFConst.PPLAN_CD_02, GET));

		}

		// リストをカンマ区切りの文字列に変換
		return getListData(nowPplanCdList, JFUStrConst.COMMA);
	}

	/**
	 * カンマ区切りリスト作成
	 * <br>
	 * @param list
	 * @param cmma
	 * @return String
	 */
	String getListData(ArrayList<String> list, String cmma)
	{
		StringBuffer strTmp = new StringBuffer();

		for (String temp : list)
		{
			strTmp.append(temp).append(cmma);
		}

		if (strTmp.length() > 0)
		{
			return strTmp.substring(0, strTmp.length() - 1);
		}
		else
		{
			return JFUStrConst.EMPTY;
		}

	}

	/**
	 * サービス契約の予約チェック
	 * <br>
	 * @param bean
	 * @param outputMap
	 * @throws Exception
	 */
	private void checkSvcRsvKei(X31SDataBeanAccess bean, HashMap<String, Object> outputMap) throws Exception
	{

		HashMap fusv028001CCMap = (HashMap)outputMap.get(SC_TITLE_FUSV028001CC);
		HashMap fusv028002CCMap = (HashMap)outputMap.get(SC_TITLE_FUSV028002CC);

		String wribSvcCd = JFUStrConst.EMPTY;
		String wribSvcKeiNo = JFUStrConst.EMPTY;

		// ○オプションの予約チェック
		ArrayList<HashMap<String, String>> opSvcRsvList = (ArrayList)fusv028001CCMap.get("out_op_svc_rsv_list");
		if (opSvcRsvList.size() > 0)
		{
			// eo光電話予約ありエラー
			DEBUG_LOG.info("■■■FUW11001 電話オプションパック申込解約：eo光電話予約ありエラー■■■");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0124); // "0124"：eo光電話予約ありエラー
		}

		// ○契約中割引サービスのチェック
		// 　※サービス利用開始希望年月日＞運用日の場合は、予約のため契約状態エラーにする。
		// 　予約の解約、キャンセルもみるためステータスは見ない。
		ArrayList<HashMap<String, String>> wribSvcKeiList = (ArrayList)fusv028002CCMap.get("wrib_svc_kei_list");
		for (HashMap<String, String> dataMap : wribSvcKeiList)
		{
			String svcUseStaKiboYmd = dataMap.get("svc_use_sta_kibo_ymd");
			if (!JFUWebCommon.isNull(svcUseStaKiboYmd))
			{
				if (JPCUtilCommon.isFutureDate(svcUseStaKiboYmd, JCCWebCommon.getOpeDate(this, null), "0"))
				{
					// eo光電話予約ありエラー
					DEBUG_LOG.info("■■■FUW11001 電話オプションパック申込解約：eo光電話予約ありエラー■■■");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0124); // "0124"：eo光電話予約ありエラー
				}
			}

		}

		// ○契約中割引サービスデータの取得
		// 　※有効な割引データを取得
		for (HashMap<String, String> dataMap : wribSvcKeiList)
		{
			if (WRIV_SVC_KEI_STAT_MUKO.contains(dataMap.get("wrib_svc_kei_stat")))
			{
				continue;
			}

			wribSvcCd = dataMap.get("wrib_svc_cd");
			wribSvcKeiNo = dataMap.get("wrib_svc_kei_no");

		}

		// ○契約中割引サービスコード
		bean.sendMessageString(FUW11001SFConst.NOW_WRIB_SVC_CD, SET, wribSvcCd);
		// ○契約中割引サービス契約番号
		bean.sendMessageString(FUW11001SFConst.NOW_WRIB_SVC_KEI_NO, SET, wribSvcKeiNo);

	}

	/**
	 * 表示フラグ設定
	 * <br>
	 * @param bean
	 * @param screenId
	 */
	private void changeDspFlag(X31SDataBeanAccess bean, String screenId)
	{
		// ※FUW11001の画面以外で、お得判定後の割引サービスコードが入っている場合は、それで表示
		// 　お得判定後の割引サービスコードがNULLの場合は、申込時の割引サービスコードで表示。

		// 申込時割引サービスコード
		String mskmWribSvcCd = bean.sendMessageString(FUW11001SFConst.MSKM_WRIB_SVC_CD, GET);
		// お得判定後割引サービスコード
		String otokuWribSvcCd = bean.sendMessageString(FUW11001SFConst.OTOKU_WRIB_SVC_CD, GET);

		// ベースとなる割引サービスコード
		String baseWriSvcCd = "";
		if (!JFUScreenConst.SCREEN_ID_FUW11001.equals(screenId) && !JFUWebCommon.isNull(otokuWribSvcCd))
		{
			baseWriSvcCd = otokuWribSvcCd;
		}
		else
		{
			baseWriSvcCd = mskmWribSvcCd;
		}

		// 画面用表示リスト
		X31SDataBeanAccessArray dspOptionList = bean.getDataBeanArray(FUW11001SFConst.DSP_OPTION_LIST);
		for (int i = 0; i < dspOptionList.getCount(); i++)
		{
			X31SDataBeanAccess dspBean = dspOptionList.getDataBean(i);
			if (dspBean.sendMessageString(FUW11001SFConst.WRIB_SVC_CD_LIST_02, GET).contains(baseWriSvcCd))
			{
				dspBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, SET, "1"); // "1"：表示
			}
			else
			{
				dspBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, SET, "0"); // "2"：非表示
			}
		}

		// ○確認画面以降（申込画面以外）で、個別オプション画面の場合は、表示を切り替える。
		// 申込、解約、既契約以外は、表示しない
		if (!JFUScreenConst.SCREEN_ID_FUW11001.equals(screenId) && JFUWebCommon.isNull(otokuWribSvcCd))
		{
			for (int i = 0; i < dspOptionList.getCount(); i++)
			{
				X31SDataBeanAccess dspBean = dspOptionList.getDataBean(i);
				if (JFUStrConst.CD00002_0.equals(dspBean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET))
						&& !dspBean.sendMessageBoolean(FUW11001SFConst.MSKM_02, GET) && !dspBean.sendMessageBoolean(FUW11001SFConst.DSL_02, GET))
				{
					dspBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, SET, "0"); // "0"：非表示
				}
			}
		}
	}

	/**
	 * 世代登録年月日時分秒（サービス契約内訳）の取得
	 * <br>
	 * @param commonInfoBean
	 * @return String
	 */
	private String getSvcKeiUcwkNoGeneAddDtm(X31SDataBeanAccess commonInfoBean)
	{

		// ○世代登録年月日時分秒（サービス契約内訳）
		String geneAddDtm = null;

		// 共通フォームBean/ＷＥＢ変更情報/0/現顧客契約情報/0/サービス契約情報/0
		X31SDataBeanAccess svcKeiInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);
		// 共通フォームBean/ＷＥＢ変更情報/0/現顧客契約情報/0/サービス契約情報/0/サービス契約内訳情報/0
		X31SDataBeanAccessArray svcKeiUcwkInfoList = svcKeiInfo.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO);
		for (int i = 0; i < svcKeiUcwkInfoList.getCount(); i++)
		{
			X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiUcwkInfoList.getDataBean(i);

			// サービス契約内訳ステータス
			String svcKeiUcwkStat = svcKeiUcwkInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_STAT_24, GET);

			// 解約・キャンセル時は、スキップ
			if (SVC_KEI_STAT_MUKO.contains(svcKeiUcwkStat))
			{
				continue;
			}
			// 世代登録年月日時分秒
			geneAddDtm = svcKeiUcwkInfoBean.sendMessageString(CommonInfoCFConst.GENE_ADD_DTM_24, GET);
		}

		return geneAddDtm;

	}

	/**
	 * 割引判定のチェック
	 *
	 * @param bean
	 * @param commBean
	 */
	private void checkPackData(X31SDataBeanAccess bean, X31SDataBeanAccess commBean)
	{

		/** 対象オプション */
		final List<String> TGT_TEL_OP_SVC_CD =
				Arrays.asList(JFUStrConst.CD00134_B27, JFUStrConst.CD00134_B28, JFUStrConst.CD00134_B29, JFUStrConst.CD00134_B30,
						JFUStrConst.CD00134_B31, JFUStrConst.CD00134_D07, JFUStrConst.CD00134_D08);

		// 契約中の割引サービスコード
		String nowWribSvcCd = bean.sendMessageString(FUW11001SFConst.NOW_WRIB_SVC_CD, GET);
		// お得判定後の割引サービスコード（実際申込されるパック）
		String otokuWribSvcCd = bean.sendMessageString(FUW11001SFConst.OTOKU_WRIB_SVC_CD, GET);
		// サービス契約内訳番号
		String nowSvcKeiUcwkNo = bean.sendMessageString(FUW11001SFConst.SVC_KEI_UCWK_NO, GET);

		// ●共有フォームビーンから契約中オプションを取得
		HashMap<String, String> telOpMap = new HashMap<String, String>();

		// オプションサービス契約情報
		X31SDataBeanAccessArray opSvcKeiInfoArray = commBean.getDataBeanArray(JFUWebCommon.OP_SVC_KEI_INFO);
		for (int i = 0; i < opSvcKeiInfoArray.getCount(); ++i)
		{
			X31SDataBeanAccess opSvcKeiInfo = opSvcKeiInfoArray.getDataBean(i);

			String opSvcKeiNo = opSvcKeiInfo.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_28, GET);
			String pcrsCd = opSvcKeiInfo.sendMessageString(CommonInfoCFConst.PCRS_CD_28, GET);
			String svcKeiUcwkNo = opSvcKeiInfo.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_NO_28, GET);
			String opSvcKeiStat = opSvcKeiInfo.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_STAT_28, GET);

			// サービス契約内訳番号が異なる場合スキップ
			if (!nowSvcKeiUcwkNo.equals(svcKeiUcwkNo))
			{
				continue;
			}
			// 対象オプションサービス以外の場合スキップ
			if (!TGT_TEL_OP_SVC_CD.contains(pcrsCd))
			{
				continue;
			}
			// 無効なステータスの場合スキップ
			if (SVC_KEI_STAT_MUKO.contains(opSvcKeiStat))
			{
				continue;
			}

			telOpMap.put(pcrsCd, opSvcKeiNo);

		}

		// サブオプションサービス契約情報
		X31SDataBeanAccessArray sbopSvcKeiInfoArray = commBean.getDataBeanArray(JFUWebCommon.SBOP_SVC_KEI_INFO);
		for (int i = 0; i < sbopSvcKeiInfoArray.getCount(); ++i)
		{
			X31SDataBeanAccess sbopSvcKeiInfo = sbopSvcKeiInfoArray.getDataBean(i);

			String opSvcKeiNo = sbopSvcKeiInfo.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_29, GET);
			String sbopSvcKeiNo = sbopSvcKeiInfo.sendMessageString(CommonInfoCFConst.SBOP_SVC_KEI_NO_29, GET);
			String pcrsCd = sbopSvcKeiInfo.sendMessageString(CommonInfoCFConst.PCRS_CD_29, GET);
			String sbopSvcKeiStat = sbopSvcKeiInfo.sendMessageString(CommonInfoCFConst.SBOP_SVC_KEI_STAT_29, GET);

			// オプションサービス契約番号が存在しない場合スキップ
			if (!telOpMap.containsValue(opSvcKeiNo))
			{
				continue;
			}
			// 対象オプションサービス以外の場合スキップ
			if (!TGT_TEL_OP_SVC_CD.contains(pcrsCd))
			{
				continue;
			}
			// 無効なステータスの場合スキップ
			if (SVC_KEI_STAT_MUKO.contains(sbopSvcKeiStat))
			{
				continue;
			}

			telOpMap.put(pcrsCd, sbopSvcKeiNo);
		}

		// ●解約するオプションを除外
		// 表示用オプション
		X31SDataBeanAccessArray inputList = bean.getDataBeanArray(FUW11001SFConst.DSP_OPTION_LIST);

		for (int i = 0; i < inputList.getCount(); i++)
		{
			// 表示用オプションの取得
			X31SDataBeanAccess inputBean = inputList.getDataBean(i);

			// 表示フラグが表示、かつ、選択がない場合はスキップ
			if ("1".equals(inputBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, GET))
					&& !inputBean.sendMessageBoolean(FUW11001SFConst.MSKM_02, GET) && !inputBean.sendMessageBoolean(FUW11001SFConst.DSL_02, GET))
			{
				continue;
			}

			// 表示フラグが非表示、かつ、未契約の場合はスキップ
			if ("0".equals(inputBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, GET))
					&& "0".equals(inputBean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET)))
			{
				continue;
			}

			// 申込区分
			String mskmKbn = "";
			// 申込選択時 且つ、表示フラグが表示の場合
			if (inputBean.sendMessageBoolean(FUW11001SFConst.MSKM_02, GET)
					&& "1".equals(inputBean.sendMessageString(FUW11001SFConst.DSP_FLAG_02, GET)))
			{
				mskmKbn = "1"; // "1"：申込
			}
			// 解約選択時　または、(契約中 且つ 表示フラグが非表示)の場合
			if (inputBean.sendMessageBoolean(FUW11001SFConst.DSL_02, GET)
					|| ("1".equals(inputBean.sendMessageString(FUW11001SFConst.KEI_STAT_FLAG_02, GET)) && "0".equals(inputBean.sendMessageString(
							FUW11001SFConst.DSP_FLAG_02, GET))))
			{
				mskmKbn = "2"; // "2"：解約
			}

			// 料金コースコード
			String pcrsCd = inputBean.sendMessageString(FUW11001SFConst.PCRS_CD_02, GET);
			// サブオプションサービスコード
			String sbopSvcCd = inputBean.sendMessageString(FUW11001SFConst.SBOP_SVC_CD_02, GET);
			if (!JFUWebCommon.isNull(sbopSvcCd))
			{
				// サブオプションサービス契約番号
				String sbopSvcKeiNo = inputBean.sendMessageString(FUW11001SFConst.SBOP_SVC_KEI_NO_02, GET);
				if ("1".equals(mskmKbn))
				{
					// 申込時
					telOpMap.put(pcrsCd, sbopSvcKeiNo);

				}
				else if ("2".equals(mskmKbn))
				{
					// 解約時
					telOpMap.remove(pcrsCd);
				}
			}
			else
			{
				// オプションサービス契約番号
				String opSvcKeiNo = inputBean.sendMessageString(FUW11001SFConst.OP_SVC_KEI_NO_02, GET);
				if ("1".equals(mskmKbn))
				{
					// 申込時
					telOpMap.put(pcrsCd, opSvcKeiNo);

				}
				else if ("2".equals(mskmKbn))
				{
					// 解約時
					telOpMap.remove(pcrsCd);
				}
			}

		}

		// ●オプション状態から最適な割引サービスコードを判定
		String checkWribSvcCd = checkPackHantei(telOpMap);

		// ○お得判定後の割引サービスコードと上記の割引サービスコードが異なる場合、BUSログに出力
		if (!otokuWribSvcCd.equals(checkWribSvcCd))
		{
			outputBusLog("WARN：※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
			outputBusLog("WARN： ●FUW11001eo光電話オプションパックのお申し込み画面で判定した");
			outputBusLog("WARN： 　お得判定の割引サービスコードとロジックで判定した割引サービスコードが異なります。");
			outputBusLog("WARN： 　・SYSID                             ＝【" + bean.sendMessageString(FUW11001SFConst.SYSID, GET) + "】");
			outputBusLog("WARN： 　・サービス契約番号                  ＝【" + bean.sendMessageString(FUW11001SFConst.SVC_KEI_NO, GET) + "】");
			outputBusLog("WARN： 　・サービス契約内訳番号              ＝【" + bean.sendMessageString(FUW11001SFConst.SVC_KEI_UCWK_NO, GET) + "】");
			outputBusLog("WARN： 　・お得判定の割引サービスコード      ＝【" + otokuWribSvcCd + "】");
			outputBusLog("WARN： 　・ロジック判定の割引サービスコード  ＝【" + checkWribSvcCd + "】");
			outputBusLog("WARN： 　・契約中の割引サービスコード        ＝【" + nowWribSvcCd + "】");
			outputBusLog("WARN： 　参考＞W00000007（パック３）、W00000008（パック７）");
			outputBusLog("WARN：※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");

//			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
		}

	}

	/**
	 * 申込状況から最適な割引を判定
	 *
	 * @param telOpMap
	 * @return String
	 */
	private String checkPackHantei(HashMap<String, String> telOpMap)
	{

		final HashMap<String, String> OP_WEIGHT_LIST = new HashMap<String, String>()
		{
			{
				put("B29", "1");
				put("B27", "10");
				put("B28", "100");
				put("D07", "1000");
				put("D08", "10000");
				put("B30", "100000");
				put("B31", "1000000");
			}
		};

		final HashMap<String, String> OP_PATTERN_LIST = new HashMap<String, String>()
		{
			{

				put("0000000000000000", "");
				put("0000000000000001", "");
				put("0000000000000010", "");
				put("0000000000000011", "W00000007");
				put("0000000000000100", "");
				put("0000000000000101", "W00000007");
				put("0000000000000110", "W00000007");
				put("0000000000000111", "W00000007");
				put("0000000000001000", "");
				put("0000000000001001", "");
				put("0000000000001010", "");
				put("0000000000001011", "");
				put("0000000000001100", "");
				put("0000000000001101", "W00000008");
				put("0000000000001110", "W00000008");
				put("0000000000001111", "W00000008");
				put("0000000000010000", "");
				put("0000000000010001", "");
				put("0000000000010010", "");
				put("0000000000010011", "W00000008");
				put("0000000000010100", "");
				put("0000000000010101", "W00000008");
				put("0000000000010110", "");
				put("0000000000010111", "W00000008");
				put("0000000000011000", "");
				put("0000000000011001", "");
				put("0000000000011010", "");
				put("0000000000011011", "");
				put("0000000000011100", "");
				put("0000000000011101", "W00000008");
				put("0000000000011110", "");
				put("0000000000011111", "W00000008");
				put("0000000000100000", "");
				put("0000000000100001", "");
				put("0000000000100010", "");
				put("0000000000100011", "W00000008");
				put("0000000000100100", "");
				put("0000000000100101", "W00000008");
				put("0000000000100110", "W00000008");
				put("0000000000100111", "W00000008");
				put("0000000000101000", "");
				put("0000000000101001", "");
				put("0000000000101010", "");
				put("0000000000101011", "");
				put("0000000000101100", "W00000008");
				put("0000000000101101", "W00000008");
				put("0000000000101110", "W00000008");
				put("0000000000101111", "W00000008");
				put("0000000000110000", "");
				put("0000000000110001", "W00000008");
				put("0000000000110010", "");
				put("0000000000110011", "W00000008");
				put("0000000000110100", "");
				put("0000000000110101", "W00000008");
				put("0000000000110110", "");
				put("0000000000110111", "W00000008");
				put("0000000000111000", "");
				put("0000000000111001", "");
				put("0000000000111010", "");
				put("0000000000111011", "");
				put("0000000000111100", "");
				put("0000000000111101", "W00000008");
				put("0000000000111110", "");
				put("0000000000111111", "W00000008");
				put("0000000001000000", "");
				put("0000000001000001", "");
				put("0000000001000010", "");
				put("0000000001000011", "W00000008");
				put("0000000001000100", "");
				put("0000000001000101", "W00000008");
				put("0000000001000110", "W00000008");
				put("0000000001000111", "W00000008");
				put("0000000001001000", "");
				put("0000000001001001", "");
				put("0000000001001010", "");
				put("0000000001001011", "");
				put("0000000001001100", "W00000008");
				put("0000000001001101", "W00000008");
				put("0000000001001110", "W00000008");
				put("0000000001001111", "W00000008");
				put("0000000001010000", "");
				put("0000000001010001", "W00000008");
				put("0000000001010010", "");
				put("0000000001010011", "W00000008");
				put("0000000001010100", "");
				put("0000000001010101", "W00000008");
				put("0000000001010110", "");
				put("0000000001010111", "W00000008");
				put("0000000001011000", "");
				put("0000000001011001", "");
				put("0000000001011010", "");
				put("0000000001011011", "");
				put("0000000001011100", "");
				put("0000000001011101", "W00000008");
				put("0000000001011110", "");
				put("0000000001011111", "W00000008");
				put("0000000001100000", "");
				put("0000000001100001", "W00000008");
				put("0000000001100010", "W00000008");
				put("0000000001100011", "W00000008");
				put("0000000001100100", "W00000008");
				put("0000000001100101", "W00000008");
				put("0000000001100110", "W00000008");
				put("0000000001100111", "W00000008");
				put("0000000001101000", "");
				put("0000000001101001", "");
				put("0000000001101010", "");
				put("0000000001101011", "");
				put("0000000001101100", "W00000008");
				put("0000000001101101", "W00000008");
				put("0000000001101110", "W00000008");
				put("0000000001101111", "W00000008");
				put("0000000001110000", "");
				put("0000000001110001", "W00000008");
				put("0000000001110010", "");
				put("0000000001110011", "W00000008");
				put("0000000001110100", "");
				put("0000000001110101", "W00000008");
				put("0000000001110110", "");
				put("0000000001110111", "W00000008");
				put("0000000001111000", "");
				put("0000000001111001", "");
				put("0000000001111010", "");
				put("0000000001111011", "");
				put("0000000001111100", "");
				put("0000000001111101", "W00000008");
				put("0000000001111110", "");
				put("0000000001111111", "W00000008");
			}
		};

		long ans = 0;
		for (Map.Entry<String, String>e :telOpMap.entrySet())
		{
			if (!JFUWebCommon.isNull(OP_WEIGHT_LIST.get(e.getKey())))
			{
				ans = ans + Long.parseLong(OP_WEIGHT_LIST.get(e.getKey()));
			}
		}

		String pat = JPCUtilCommon.fillZero(String.valueOf(ans), 16, false);

		return OP_PATTERN_LIST.get(pat);
	}

	/**
	 * ビジネスログへの出力処理
	 *
	 * @param msg ログ情報
	 */
	private void outputBusLog(String msg)
	{
		JSYwebLog.println(JSYwebLog.EXECUTION, getClass(), msg, "CS0003I", null, null);
	}

	/**
	 * 利用可能とする督促ステータスチェック
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param serviceFormBean eo光電話お客さま契約情報変更／照会メニューサービスフォームBean
	 * @throws Exception
	 */
	private void checkTokusokuStat(final X31SDataBeanAccess commonInfoBean,
			final X31SDataBeanAccess serviceFormBean) throws Exception
	{

		// -------------------------------------------------
		// 現顧客契約情報からサービス契約情報を取得
		// -------------------------------------------------
		// ★WEB変更情報
		X31SDataBeanAccess webChgInfoBean = getX31SDataBeanAccess(commonInfoBean, CommonInfoCFConst.WEB_CHG_INFO);

		// ★現顧客情報(WEB変更情報の子階層)
		X31SDataBeanAccessArray genCustKeiInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO);
		X31SDataBeanAccess genCustKeiInfoBean = genCustKeiInfoArray.getDataBean(0);

		// ★サービス契約情報
		X31SDataBeanAccessArray svcKeiInfoArray = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess svcKeiInfoBean = svcKeiInfoArray.getDataBean(0);

		// ★請求契約情報
		X31SDataBeanAccessArray seikyKeiInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SEIKY_KEI_INFO);
		X31SDataBeanAccess seikyKeiInfoBean = seikyKeiInfoArray.getDataBean(0);

		String tokusokuStat = seikyKeiInfoBean.sendMessageString(CommonInfoCFConst.TOKUSOKU_STAT_32, GET);

		// 共有フォームBean.請求契約情報.督促ステータスが「00:督促なし」の場合、チェック処理を抜ける
		if (JFUWebCommon.isNull(tokusokuStat) || JFUStrConst.CD00184_00.equals(tokusokuStat))
		{
			return;
		}

		if (Integer.parseInt(tokusokuStat) >= Integer.parseInt(JFUStrConst.CD00184_15))
		{
			// 督促ステータスが「15:強制解約予告済」以上の場合

			// ●督促エラー有無を「有」とする。
			serviceFormBean.sendMessageString(FUW11001SFConst.TOKUSOKU_ERR_UM, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.CD00002_1);
		}
	}

	/**
	 * データBeanリストから0番目のデータBeanを取得
	 * <br/>
	 * データBeanリストから0番目のデータBeanを取得します。
	 *
	 * @param bean サービスフォームBean
	 * @param componentID 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;
	}


}
