/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：FUW10101SFLogic
 *   ソースファイル名：FUW10101SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2012年03月13日
 *＜機能概要＞
 *   IPv6サービス申込のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v3.00       2012/03/13   FJ）南岡    新規作成【ANK-0046-00-00】 IPV6対応
 *   v4.00       2012/06/27   FJ）知識    変更【ANK-1163-00-00】 変更系申込が可能となるタイミングについて
 *   v3.00       2012/08/21   FJ）山名    変更【ST1-2012-0000365】オーダ発行条件登録CC設定値修正
 *   v4.00       2012/11/21   FJ）大島    変更【IT2-2012-0001747】エラーハンドリング対応
 *   v4.00       2013/01/07   FJ）岡井    変更【ANK-1399-00-00】IPv6対応ルーター機器出荷済チェック追加
 *   v8.00       2014/01/27   FJ）文元    変更【ANK-1589-00-00】消費増税に伴う料金施策
 *   v14.00      2015/11/22   FJ）中谷    変更【OM-2015-0002670】IPv6解約時のSOD不具合対応
 *   v20.00      2016/01/05   FJ) 岡井    変更【ANK-2612-00-00】10Gコース導入対応
 *   v37.00      2018/02/16   FJ)美濃原   変更【ANK-3366-00-00】eo光設備卸対応
 *   
**********************************************************************/
package eo.web.webview.FUW10101SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

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.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0212_FUSV0212OPDBMapper;
import eo.web.webview.mapping.FUSV0213_FUSV0213OPDBMapper;

/**
 * IPv6サービス申込のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW10101SFLogic extends JCCWebBusinessLogic
{

	/** DataBean操作種別：項目値設定 */
	private static final String SET = X31CWebConst.DATABEAN_SET_VALUE;
	/** DataBean操作種別：項目値取得 */
	private static final String GET = X31CWebConst.DATABEAN_GET_VALUE;

	/** サービスID：IPv6サービス申込(初期表示) */
	private static final String USECASE_ID_FUSV0212 = "FUSV0212";
	/** サービスID：IPv6サービス申込(申込) */
	private static final String USECASE_ID_FUSV0213 = "FUSV0213";

	/** 機能ID：申し込み完了メール */
	private static final String PROC_ID_FUW101_1 = "FUW101_1";
	/** 機能ID：申し込み完了メール */
	private static final String PROC_ID_FUW101_2 = "FUW101_2";

	/** アウトマップキー 料金プラン固定単価（基本料金）一覧照会 */
	private static final String FUSV021201SC = "FUSV021201SC";
	/** アウトマップキー 初期費用一覧照会 */
	private static final String FUSV021202CC = "FUSV021202CC";

	/** マップキー EKK0601B001CBSMsg1List */
	private static final String EKK0601B001CBSMSG1LIST = "EKK0601B001CBSMsg1List";

	/** 料金プラン固定金額 */
	private static final String PPLAN_KOTEI_AMNT = "pplan_kotei_amnt";

	/** エラー判定用テンプレート：EKK0341B002_機器提供サービス契約一覧照会（サービス契約番号） */
	private static final String EKK0341B002 = "EKK0341B002";
	/** エラー判定用テンプレート：EKK0351B002_料金コース_オプションサービス一意照会 */
	private static final String EKK0351B002 = "EKK0351B002";
	/** エラー判定用テンプレート：EKK0251B003_サービス契約回線内訳一覧照会（現在利用中） */
	private static final String EKK0251B003 = "EKK0251B003";
	/** エラー判定用テンプレート：EZM0331A010_起点変電所一意照会 */
	private static final String EZM0331A010 = "EZM0331A010";
	/** エラー判定用テンプレート：EZM0341A010_集約局一意照会 */
	private static final String EZM0341A010 = "EZM0341A010";
	/** エラー判定用テンプレート：EZM0411A010_宅内機器型式一意照会 */
	private static final String EZM0411A010 = "EZM0411A010";
	/** エラー判定用テンプレート：EKU0011B010工事案件一覧照会 */
	private static final String EKU0011B010 = "EKU0011B010";
	/** エラー判定用テンプレート：EKK0361D010_オプションサービス契約<ISP>登録 */
	private static final String EKK0361D010 = "EKK0361D010";

	/** エラー判定用アイテム：IPv6サービス契約数 */
	private static final String IPV6_SVC_KEI_CNT = "ipv6_svc_kei_cnt";
	/** エラー判定用アイテム：起点変電所コード */
	private static final String KITEN_HDSHO_CD = "kiten_hdsho_cd";
	/** エラー判定用アイテム：集約局コード */
	private static final String SHYAKK_CD = "shyakk_cd";
	/** エラー判定用アイテム：中心局コード */
	private static final String CHUSKK_CD = "chuskk_cd";
	/** エラー判定用アイテム：IPv6対応機器サービス契約 */
	private static final String IPV6_KIKI_SVC_KEI = "ipv6_kiki_svc_kei";
	/** エラー判定用アイテム：工事案件 */
	private static final String KOJIAK = "kojiak";
	/** エラー判定用アイテム：更新年月日時分秒(更新前) */
	private static final String OP_SVC_CD = "op_svc_cd";
	/** エラー判定用アイテム：更新年月日時分秒(更新前) */
	private static final String UPD_DTM_BF = "upd_dtm_bf";
	/** エラー判定用アイテム：サービス契約番号 */
	private static final String KEY_SVC_KEI_NO = "key_svc_kei_no";
	/** エラー判定用アイテム：機器提供サービス契約番号 */
	private static final String KEY_KKTK_SVC_KEI_NO = "key_kktk_svc_kei_no";

	/**
	 * 初期処理
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{

		DEBUG_LOG.info("----- FUW10101 Start init -----");

		// -------------------------------------------------
		// ■設備卸チェック
		// -------------------------------------------------
		JFUWebCommon.checkOrosi(this);

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// ■初期表示時のエラーチェック処理
		chkInit(commonInfoBean);

		// -------------------------------------------------
		// ■IPv6サービス申込(初期表示)サービス実行
		// -------------------------------------------------
		executeInitService(commonInfoBean, serviceFormBean);

		// 料金表表示現在日設定処理
		JFUWebCommon.setPrcDspNowDay(this);

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getScreenId(this));
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW10101);

		DEBUG_LOG.info("----- FUW10101 End init -----");

		return true;
	}

	/**
	 * 確認画面の確認するボタン押下
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean cfm() throws Exception
	{

		DEBUG_LOG.info("----- FUW10101 Start cfm -----");

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW10102);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW10102);

		DEBUG_LOG.info("----- FUW10101 End cfm -----");

		return true;
	}

	/**
	 * 確認画面の戻るボタン押下
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean back() throws Exception
	{

		DEBUG_LOG.info("----- FUW10101 Start back -----");

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW10101);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW10101);

		DEBUG_LOG.info("----- FUW10101 End back -----");

		return true;
	}

	/**
	 * 申込画面の申し込むボタン押下
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean mskm() throws Exception
	{

		DEBUG_LOG.info("----- FUW10101 Start mskm -----");

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// -------------------------------------------------
		// ■共通関連チェックの呼び出し処理
		// -------------------------------------------------
		JFUWebCommon.checkCommonRelation(this, USECASE_ID_FUSV0213);

		// -------------------------------------------------
		// ■IPv6サービス申込(申込)サービス実行
		// -------------------------------------------------
		executeMskmService(commonInfoBean, serviceFormBean);

		// -------------------------------------------------
		// ■申込完了メール送信
		// -------------------------------------------------
		// 料金グループコード
		boolean takinou = serviceFormBean.sendMessageBoolean(FUW10101SFConst.TKN_ROUTER_HOJI_FLG, X31CWebConst.DATABEAN_GET_VALUE);
		// 多機能ルーター保有時
		if(takinou)
		{
			JFUWebCommon.sendMskmFinMail(this, PROC_ID_FUW101_2);
		}
		// 多機能ルーター未保有時
		else
		{
			JFUWebCommon.sendMskmFinMail(this, PROC_ID_FUW101_1);
		}
		

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW10103);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW10103);

		DEBUG_LOG.info("----- FUW10101 End mskm -----");

		return true;
	}

	/**
	 * IPv6サービス申込(初期表示)サービス実行処理
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param serviceFormBean IPv6サービス申込サービスフォームBean
	 * @throws Exception
	 */
	private void executeInitService(final X31SDataBeanAccess commonInfoBean, final X31SDataBeanAccess serviceFormBean) throws Exception
	{
		DEBUG_LOG.info("----- FUW10101 Start executeInitService -----");

		// SSO情報
		X31SDataBeanAccess ssoInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);
		// サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);
		// サービス契約回線内訳情報
		X31SDataBeanAccess svcKeiKaisenUwInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_KAISEN_UCWK_INFO);

		// サービス検索条件格納用マップ
		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		// サービス処理結果格納用マップ
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// サービスパラメータ生成
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0212);

		// DataBean-BPマッピングクラス生成
		FUSV0212_FUSV0212OPDBMapper mapper = new FUSV0212_FUSV0212OPDBMapper();

		// 上り/下りマッピング用パラメータ生成
		X31SDataBeanAccess[] serviceFormBeanArray = new X31SDataBeanAccess[] { serviceFormBean, ssoInfoBean, svcKeiInfoBean, svcKeiKaisenUwInfoBean };

		// IPv6サービス関連チェックCC上りマッピング
		mapper.setFUSV021201CC(serviceFormBeanArray, inputMap);
		// 料金プラン固定単価（基本料金）一覧照会SC上りマッピング
		mapper.setFUSV021201SC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// 初期費用一覧照会コモンコンポーネント部品CC
		mapper.setFUSV021202CC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// 機器オプションサービス契約一覧照会(フロント)上りマッピング
		mapper.setFUSV021202SC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);

		try
		{
			// IPv6サービス申込(初期表示)サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);

			// IPv6サービス関連チェックCC下りマッピング
			mapper.getFUSV021201CC(serviceFormBeanArray, outputMap);
			// 料金プラン固定単価（基本料金）一覧照会SC下りマッピング
			mapper.getFUSV021201SC(serviceFormBeanArray[0], outputMap);
			// 初期費用一覧照会コモンコンポーネント部品CC下りマッピング
			mapper.getFUSV021202CC(serviceFormBeanArray[0], outputMap);
			// 機器オプションサービス契約一覧照会(フロント)SC下りマッピング
			mapper.getFUSV021202SC(serviceFormBeanArray[0], outputMap);

		}
		catch (JCCWebServiceException se)
		{
			// 初期表示時例外ハンドリング処理
			handleInitException(se);
		}

		// -------------------------------------------------
		// ■サービスフォームBean項目設定
		// -------------------------------------------------
		// 有料フラグ
		boolean payFlag = setPayFlg(serviceFormBean, outputMap);

		// 無料の場合、無料文言を表示する
		if (!payFlag)
		{
			JFUWebCommon.setFreePrcInfoMap(outputMap, FUSV021201SC);
		}

		serviceFormBean.sendMessageBoolean(FUW10101SFConst.PAY_FLG, SET, payFlag);

		// マンション区分
		serviceFormBean.sendMessageBoolean(FUW10101SFConst.MANSION_DIV, SET, getMansionDiv(commonInfoBean));

		// 料金表マッピング(FUSV021201SC、FUSV021202CC)
		JFUWebCommon.setPrcInfoArea(serviceFormBeanArray[0], outputMap, FUSV021201SC, FUSV021202CC, JFUScreenConst.SCREEN_ID_FUW10101);

		DEBUG_LOG.info("----- FUW10101 End executeInitService -----");
	}

	/**
	 * IPv6サービス申込(申込)サービス実行処理
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param serviceFormBean IPv6サービス申込サービスフォームBean
	 * @return サービス処理結果マップ
	 */
	private HashMap<String, HashMap<String, Object>> executeMskmService(final X31SDataBeanAccess commonInfoBean,
			final X31SDataBeanAccess serviceFormBean)
	{
		DEBUG_LOG.info("----- FUW10101 Start executeMskmService -----");

		// SSO情報
		X31SDataBeanAccess ssoInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);
		// サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);
		// サービス契約内訳情報
		X31SDataBeanAccess svcKeiUcwkInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_UCWK_INFO);
		// 請求契約情報
		X31SDataBeanAccess seikyKeiInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SEIKY_KEI_INFO);

		// サービス検索条件格納用マップ
		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		// サービス処理結果格納用マップ
		HashMap<String, HashMap<String, Object>> outputMap = new HashMap<String, HashMap<String, Object>>();

		// サービスパラメータ生成
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0213);

		// DataBean-BPマッピングクラス生成
		FUSV0213_FUSV0213OPDBMapper mapper = new FUSV0213_FUSV0213OPDBMapper();
		// 上り/下りマッピング用パラメータ生成
		X31SDataBeanAccess[] serviceFormBeanArray = new X31SDataBeanAccess[] { serviceFormBean, ssoInfoBean, svcKeiInfoBean, seikyKeiInfoBean, svcKeiUcwkInfoBean };

		// IPv6アドレス一覧照会CC上りマッピング
		mapper.setFUSV021301CC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_2);
		// 申込内容承認登録SC上りマッピング
		mapper.setFUSV021301SC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// オプションサービス契約<ISP>登録SC上りマッピング
		mapper.setFUSV021302SC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// オプションサービス契約<ISP>照査SC
		mapper.setFUSV021308SC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// オプションサービス契約<ISP>照査締結SC上りマッピング
		mapper.setFUSV021303SC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// オプションサービス契約<ISP>開始SC上りマッピング
		mapper.setFUSV021304SC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// IPv6アドレス変更SC上りマッピング
		mapper.setFUSV021305SC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// 進捗登録SC上りマッピング
		mapper.setFUSV021306SC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// 申込明細照査・後続業務依頼SC上りマッピング
		mapper.setFUSV021307SC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// サービスIF結果データ移送CC上りマッピング
		mapper.setFUSV021302CC(inputMap, this);
		// サービスIF結果データ移送CC上りマッピング
		mapper.setFUSV021304CC(inputMap, this);
		// サービスオーダ発行CC上りマッピング
		mapper.setFUSV021303CC(serviceFormBeanArray, inputMap, JPCModelConstant.FUNC_CD_1);

		// サービス契約ステータスを設定
		JFUWebCommon.setSvcKeiStat(this, inputMap);

		try
		{
			// IPv6サービス申込(申込)サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 申込時例外ハンドリング処理
			handleMskmException(se);
		}

		DEBUG_LOG.info("----- FUW10101 End executeMskmService -----");

		// サービス処理結果を返却
		return outputMap;
	}

	/**
	 * 初期表示時例外ハンドリング処理
	 * <br/>
	 * 申込処理時に発生した業務例外のハンドリングを行ないます。
	 *
	 * @param jwse 初期処理時に発生したJCCWebServiceExceptionオブジェクト
	 * @throws JCCBusinessException この例外をフロント共通エラー処理に委譲する場合
	 */
	private void handleInitException(final JCCWebServiceException se) throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW10101 Start handleInitException -----");

		// 例外詳細情報を取得
		X31CMessageMoreInfo[] moreInfo = se.getMessageList().getMessageMoreInfoList();
		// メッセージ詳細情報クラスを取得
		// (単項目チェックエラーの発生有無を確認するだけなので、先頭レコードのみ処理する)
		X31CMessageMoreInfo info = moreInfo[0];

		String templateid = info.getTemplateId();
		String status = info.getStatus();
		String itemId = info.getItemId();
		String errFlg = info.getItemCheckErr();

		// ステータスが"1100"(関連チェックエラー)の場合
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{

			// エラーフラグが"EA"の場合
			if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg))
			{

				// -------------------------------------------------
				// ■機器情報取得数チェック
				// -------------------------------------------------
				// エラー判定用テンプレートが"EKK0341B002"(機器提供サービス契約一覧照会（サービス契約番号）)
				// かつ アイテムIDがサービス契約番号の場合
				if (EKK0341B002.equals(templateid) && KEY_SVC_KEI_NO.equals(itemId))
				{
					DEBUG_LOG.info("■■■機器情報未取得（0件）エラー");
					// フロント共通エラー(機器情報未取得（0件）エラー)
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
				}

				// -------------------------------------------------
				// ■IPv6対応ルーター機器出荷済チェック
				// -------------------------------------------------
				// エラー判定用テンプレートが"EKK0341B002"(機器提供サービス契約一覧照会（サービス契約番号）)
				// かつ アイテムIDが機器提供サービス契約番号の場合
				if (EKK0341B002.equals(templateid) && KEY_KKTK_SVC_KEI_NO.equals(itemId))
				{
					DEBUG_LOG.info("■■■IPv6対応ルーター機器未出荷エラー");
					// フロント共通エラー(IPv6対応ルーター機器未出荷エラー)
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
				}

				// -------------------------------------------------
				// ■オプション上限数チェック
				// -------------------------------------------------
				// エラー判定用テンプレートが"EKK0351B002"(料金コース_オプションサービス一意照会)
				// かつ アイテムIDがIPv6サービス契約数の場合
				if (EKK0351B002.equals(templateid) && IPV6_SVC_KEI_CNT.equals(itemId))
				{
					DEBUG_LOG.info("■■■最大契約数超過エラー");
					// フロント共通エラー(最大契約数超過エラー)
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0103); // "0103"：契約済みエラー
				}

				// -------------------------------------------------
				// ■起点変電所チェック
				// -------------------------------------------------
				// エラー判定用テンプレートが"EKK0251B003"(サービス契約回線内訳一覧照会（現在利用中）)
				// かつ アイテムIDが起点変電所コード の場合
				if (EKK0251B003.equals(templateid) && KITEN_HDSHO_CD.equals(itemId))
				{
					DEBUG_LOG.info("■■■起点変電所コード取得エラー");
					// フロント共通エラー(起点変電所コード取得エラー)
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
				}

				// -------------------------------------------------
				// ■集約局チェック
				// -------------------------------------------------
				// エラー判定用テンプレートが"EKK0251B003"(サービス契約回線内訳一覧照会（現在利用中）)
				// かつ アイテムIDが集約局コード の場合
				if (EKK0251B003.equals(templateid) && SHYAKK_CD.equals(itemId))
				{
					DEBUG_LOG.info("■■■集約局コード取得エラー(サービス契約回線内訳)");
					// フロント共通エラー(集約局コード取得エラー)
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
				}

				// エラー判定用テンプレートが"EZM0331A010"(起点変電所一意照会)
				// かつ アイテムIDが集約局コード の場合
				if (EZM0331A010.equals(templateid) && SHYAKK_CD.equals(itemId))
				{
					DEBUG_LOG.info("■■■集約局コード取得エラー(起点変電所)");
					// フロント共通エラー(集約局コード取得エラー)
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
				}

				// -------------------------------------------------
				// ■中心局チェック
				// -------------------------------------------------
				// エラー判定用テンプレートが"EZM0341A010"(集約局一意照会)
				// かつ アイテムIDが中心局コード の場合
				if (EZM0341A010.equals(templateid) && CHUSKK_CD.equals(itemId))
				{
					DEBUG_LOG.info("■■■中心局コード取得エラー");
					// フロント共通エラー(中心局コード取得エラー)
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
				}

				// -------------------------------------------------
				// ■IPv6対応ルーター保有チェック
				// -------------------------------------------------
				// エラー判定用テンプレートが"EZM0411A010"(宅内機器型式一意照会)
				// かつ アイテムIDがIPv6対応機器サービス契約 の場合
				if (EZM0411A010.equals(templateid) && IPV6_KIKI_SVC_KEI.equals(itemId))
				{
					DEBUG_LOG.info("■■■IPv6対応ルーター保有エラー");
					// フロント共通エラー(IPv6対応ルーター保有エラー)
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
				}

				// -------------------------------------------------
				// ■工事未完了チェック
				// -------------------------------------------------
				// エラー判定用テンプレートが"EKU0011B010"(工事案件一覧照会)
				// かつ アイテムIDが工事案件 の場合
				if (EKU0011B010.equals(templateid) && KOJIAK.equals(itemId))
				{
					DEBUG_LOG.info("■■■工事未完了エラー");
					// フロント共通エラー(工事未完了エラー)
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
				}
			}
		}

		// その他のエラーはシステムエラーとする。
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002); // "0002"：システムエラー
	}

	/**
	 * 申し込み時例外ハンドリング処理
	 * <br/>
	 * 申込処理時に発生した業務例外のハンドリングを行ないます。
	 *
	 * @param jwse 申込処理時に発生したJCCWebServiceExceptionオブジェクト
	 * @throws JCCBusinessException この例外をフロント共通エラー処理に委譲する場合
	 */
	private void handleMskmException(final JCCWebServiceException se) throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW10101 Start handleMskmException -----");

		// 例外詳細情報を取得
		X31CMessageMoreInfo[] moreInfo = se.getMessageList().getMessageMoreInfoList();
		// メッセージ詳細情報クラスを取得
		// (単項目チェックエラーの発生有無を確認するだけなので、先頭レコードのみ処理する)
		X31CMessageMoreInfo info = moreInfo[0];

		String templateid = info.getTemplateId();
		String status = info.getStatus();
		String itemId = info.getItemId();
		String errFlg = info.getItemCheckErr();

		// ステータスが"1100"(内部スキーマ関連チェックエラー)の場合
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{

			// エラー判定用テンプレートが"EKK0361D010"(オプションサービス契約<ISP>登録)
			if (EKK0361D010.equals(templateid))
			{

				// アイテムIDがオプションサービスコードの場合
				if (OP_SVC_CD.equals(itemId))
				{

					// -------------------------------------------------
					// ■オプション上限数チェック
					// -------------------------------------------------
					// エラーフラグが"EO"の場合
					if (JFUStrConst.RELATION_CHECK_ERR_EO.equals(errFlg))
					{
						// フロント共通エラー(最大契約数超過エラー)
						throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0103); // "0103"：契約済みエラー
					}

					// -------------------------------------------------
					// ■起点変電所チェック
					// -------------------------------------------------
					// エラーフラグが"EP"の場合
					if (JFUStrConst.RELATION_CHECK_ERR_EP.equals(errFlg))
					{
						// フロント共通エラー(起点変電所コード取得エラー)
						throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
					}

					// -------------------------------------------------
					// ■集約局チェック
					// -------------------------------------------------
					// エラーフラグが"EN"の場合
					if (JFUStrConst.RELATION_CHECK_ERR_EN.equals(errFlg))
					{
						// フロント共通エラー(集約局コード取得エラー)
						throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
					}

					// -------------------------------------------------
					// ■中心局チェック
					// -------------------------------------------------
					// エラーフラグが"EQ"または"ER"の場合
					if (JFUStrConst.RELATION_CHECK_ERR_EQ.equals(errFlg) || JFUStrConst.RELATION_CHECK_ERR_ER.equals(errFlg))
					{
						// フロント共通エラー(中心局コード取得エラー)
						throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
					}

					// -------------------------------------------------
					// ■IPv6対応ルーター保有チェック
					// -------------------------------------------------
					// エラーフラグが"ES"の場合
					if (JFUStrConst.RELATION_CHECK_ERR_ES.equals(errFlg))
					{
						// フロント共通エラー(IPv6対応ルーター保有エラー)
						throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
					}

					// -------------------------------------------------
					// ■工事未完了チェック
					// -------------------------------------------------
					// エラーフラグが"ET"の場合
					if (JFUStrConst.RELATION_CHECK_ERR_ET.equals(errFlg))
					{
						// フロント共通エラー(工事未完了エラー)
						throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102); // "0102"：契約状態エラー
					}
				}

				// -------------------------------------------------
				// ■タイプスタンプチェック
				// -------------------------------------------------
				// エラーフラグがEA
				// かつ アイテムIDが更新年月日時分秒(更新前)の場合
				if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemId))
				{
					// フロント共通エラー(タイプスタンプエラー)
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0204); // "0204"：更新不可エラー
				}
			}
		}

		// その他のエラーは入力パラメータに起因しないエラーなので、システムエラー扱いとする。
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002); // "0002"：システムエラー
	}

	/**
	 * 有料フラグ判定（初期費用）処理です。
	 * @param serviceFormBean IPv6サービス申込サービスフォームBean
	 * @param outputMa サービス処理結果格納用マップp
	 * @return true:初期費用あり / false:初期費用なし
	 */
	@SuppressWarnings("unchecked")
	private boolean setPayFlg(X31SDataBeanAccess serviceFormBean, HashMap outputMap)
	{

		DEBUG_LOG.info("----- FUW10101 Start setPayFlg -----");

		//初期費用がない
		boolean res = false;

		// 無料数を取得
		int muryoCnt = Integer.parseInt(serviceFormBean.sendMessageString(FUW10101SFConst.MURYO_CNT, GET));

		// 契約数を取得
		int keiCnt = Integer.parseInt(serviceFormBean.sendMessageString(FUW10101SFConst.KEI_CNT, GET));

		// 固定単価取得チェック
		if (chkPayKoteiTanka(outputMap))
		{
			// 契約数が無料数を超える場合
			if (muryoCnt < keiCnt + 1)
			{
				// 初期費用がある場合
				res = true;
			}
		}

		DEBUG_LOG.info("----- FUW10101 End setPayFlg -----");

		return res;
	}

	/**
	 * 有料フラグ判定（固定単価）処理です。
	 * @param outputMap
	 * @return true:固定単価あり / false:固定単価なし（無料）
	 */
	@SuppressWarnings("unchecked")
	public boolean chkPayKoteiTanka(HashMap outputMap)
	{
		DEBUG_LOG.info("----- FUW10101 Start chkPayKoteiTanka -----");

		boolean res = false;
		HashMap parentMap = null;

		// 固定単価取得チェック
		if (outputMap.containsKey(FUSV021201SC))
		{
			parentMap = (HashMap)outputMap.get(FUSV021201SC);
		}

		if (null != parentMap && parentMap.containsKey(EKK0601B001CBSMSG1LIST))
		{
			ArrayList childList = (ArrayList)parentMap.get(EKK0601B001CBSMSG1LIST);

			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;
					}
					else
					{
						// 固定単価が0円の場合
						res = false;
					}
				}
			}
			else
			{
				// 固定単価がない場合
				res = false;
			}
		}

		DEBUG_LOG.info("----- FUW10101 End chkPayKoteiTanka -----");

		return res;
	}

	/**
	 * マンション区分の情報を取得します。 <BR>
	 * 
	 * @param commonInfoBean  共有フォームBean
	 * @return （true:eo光ネットマンションタイプ、
	 *            false:eo光ネットマンションタイプ以外）
	 */
	private boolean getMansionDiv(X31SDataBeanAccess commonInfoBean)
	{

		DEBUG_LOG.info("----- FUW10101 Start getMansionDiv -----");

		boolean mansionDiv = false;

		// 共有フォームBean.料金クループコードが"04"(eo光ネットマンションタイプ )の場合かつ
		// 共有フォームBean.加入契約支払方式コードが加入契約支払方式コード "003"(全戸一括)の場合
		// 
		if (JFUStrConst.CD00133_04.equals(getPrcGrpCd(commonInfoBean))
				&& JFUStrConst.CD01216_003.equals(getKanyuKeiPayHoshikiCd(commonInfoBean)))
		{
			mansionDiv = true;
		}

		DEBUG_LOG.info("----- FUW10101 End getMansionDiv -----");

		return mansionDiv;
	}

	/**
	 * 料金グループコードを取得します。
	 *  <BR>
	 * @param commonInfoBean  共有フォームBean
	 * @return 料金グループコード
	 */
	private String getPrcGrpCd(X31SDataBeanAccess commonInfoBean)
	{

		DEBUG_LOG.info("----- FUW10101 Start getPrcGrpCd -----");

		String prcGrpCd = null;

		// 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);

		// 料金グループコード
		prcGrpCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PRC_GRP_CD_23, X31CWebConst.DATABEAN_GET_VALUE);

		DEBUG_LOG.info("----- FUW10101 End getPrcGrpCd -----");

		return prcGrpCd;
	}
	
	/**
	 * 加入契約支払方式コードを取得します。
	 *  <BR>
	 * @param commonInfoBean  共有フォームBean
	 * @return 加入契約支払方式コード
	 */
	private String getKanyuKeiPayHoshikiCd(X31SDataBeanAccess commonInfoBean)
	{

		DEBUG_LOG.info("----- FUW10101 Start getkanyuKeiPayHoshikiCd -----");

		String kanyuKeiPayHoshikiCd = null;

		// 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);

		// 加入契約支払方式コード
		kanyuKeiPayHoshikiCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.KANYU_KEI_PAY_HOSHIKI_CD_23, X31CWebConst.DATABEAN_GET_VALUE);

		DEBUG_LOG.info("----- FUW10101 End getkanyuKeiPayHoshikiCd -----");

		return kanyuKeiPayHoshikiCd;
	}

	/**
	 * 初期表示時のエラーチェック処理です。
	 * 
	 * <br>
	 * @param commonInfoBean 共有フォームBean
	 */
	private void chkInit(X31SDataBeanAccess commonInfoBean)
	{
		DEBUG_LOG.info("----- FUW10101 Start chkInit -----");

		// 10ギガ契約中の申込抑止
		X31SDataBeanAccess nowSvcKeiInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);
		String nowPcrsCd = nowSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.PCRS_CD_23, X31CWebConst.DATABEAN_GET_VALUE);
		if(JFUStrConst.CD00134_A83.equals(nowPcrsCd) || JFUStrConst.CD00134_A84.equals(nowPcrsCd))
		{
			// 10ギガ契約者の場合、10ギガ契約中の申込抑止画面へ
			DEBUG_LOG.info("※10ギガ契約中の申込抑止");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0140);
		}

		DEBUG_LOG.info("----- FUW10101 End chkInit -----");
	}
}
