/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：FUW11601SFLogic
 *   ソースファイル名：FUW11601SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2015年01月22日
 *＜機能概要＞
 *   IPv6サービス解約申込のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *	v1.00.00	2015/01/22	FJ)中西		新規作成
 *  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.FUW11601SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0288_FUSV0288OPDBMapper;
import eo.web.webview.mapping.FUSV0289_FUSV0289OPDBMapper;

/**
 * IPv6サービス解約申込のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW11601SFLogic extends JCCWebBusinessLogic
{

	/** サービスID：IPv6サービス解約申込(初期表示) */
	private static final String USECASE_ID_FUSV0289 = "FUSV0289";
	/** サービスID：IPv6サービス解約申込(解約) */
	private static final String USECASE_ID_FUSV0288 = "FUSV0288";
	/** エラー判定用テンプレート：オプションサービス契約予約チェック(EKK1681B001) */
	private static final String EKK1681B001 = "EKK1681B001";
	/** エラー判定用キーワード：ＫＥＹ＿異動区分 */
	private static final String KEY_IDO_DIV = "key_ido_div";
	/** エラー判定用テンプレート：オプションサービス契約同月内変更チェック(EKK0351B003) */
	private static final String EKK0351B003 = "EKK0351B003";
	/** エラー判定用キーワード：当月申込エラー */
	private static final String THIS_MONTH_MSKM = "this_month_mskm";
	/** 更新年月日時分秒(更新前) */
	private static final String UPD_DTM_BF = "upd_dtm_bf";

	/** 申込完了メール送信部品呼出機能ID */
	private static final String MSKM_FIN_MAIL_FUW116_1 = "FUW116_1";

	/**
	 * 初期処理
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{
		DEBUG_LOG.info("----- FUW11601 Start init -----");

		// -------------------------------------------------
		// ■設備卸チェック
		// -------------------------------------------------
		JFUWebCommon.checkOrosi(this);

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// ■初期表示時のエラーチェック処理
		chkInit(commonInfoBean);

		// -------------------------------------------------
		// ■IPv6サービス解約申込(初期表示)サービス実行
		// -------------------------------------------------
		executeInitService(commonInfoBean, serviceFormBean);

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面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_FUW11601);

		DEBUG_LOG.info("----- FUW11601 End init -----");

		return true;
	}

	/**
	 * 確認画面の確認するボタン押下
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean cfm() throws Exception
	{

		DEBUG_LOG.info("----- FUW11601 Start cfm -----");

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// -------------------------------------------------
		// ■IPv6サービス解約申込(申込)サービス実行
		// -------------------------------------------------
		executeDslService(commonInfoBean, serviceFormBean, JPCModelConstant.FUNC_CD_2);

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW11602);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW11602);

		DEBUG_LOG.info("----- FUW11601 End cfm -----");

		return true;
	}

	/**
	 * 確認画面の戻るボタン押下
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean back() throws Exception
	{
		DEBUG_LOG.info("----- FUW11601 Start back -----");
		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW11601);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW11601);

		DEBUG_LOG.info("----- FUW11601 End back -----");

		return true;
	}

	/**
	 * 解約申込確認画面の解約するボタン押下
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean dsl() throws Exception
	{

		DEBUG_LOG.info("----- FUW11601 Start dsl -----");

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// -------------------------------------------------
		// ■IPv6サービス解約申込(申込)サービス実行
		// -------------------------------------------------
		executeDslService(commonInfoBean, serviceFormBean, JPCModelConstant.FUNC_CD_1);

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW11603);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW11603);

		DEBUG_LOG.info("----- FUW11601 End dsl -----");

		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("----- FUW11601 Start executeInitService -----");

		// ●共有フォームBeanより現顧客契約情報を取得する。
		Map<String, Object> resultMap = getCommoninfoBeanInfo(commonInfoBean);
		// SSO情報
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SSO_INFO);
		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);

		// ●サービス呼び出し処理
		// IPv6サービス申込（初期表示）サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0289);

		FUSV0289_FUSV0289OPDBMapper mapper = new FUSV0289_FUSV0289OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = { serviceFormBean, ssoInfoBean, opSvcKeiInfoBean };

		// 1.ネットオプションサービス契約取得CC(FUSV028901CC)
		dataMap = mapper.setFUSV028901CC_IPV6(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		try
		{
			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);

		}
		catch (JCCWebServiceException se)
		{
			// 関連チェックを行う
			handleInitException(se);
		}

		// ●サービス処理結果の取得
		// 1.ネットオプションサービス契約取得CC(FUSV028901CC)
		mapper.getFUSV028901CC_RS(serviceFormBean, outputMap);

		DEBUG_LOG.info("----- FUW11601 End executeInitService -----");
	}

	/**
	 * 
	 * 共有フォームBeanの情報を取得します。 <BR>
	 * 
	 * @param commoninfoBean 共有フォームBean
	 * @return 取得した情報を保持したマップ
	 */

	private Map<String, Object> getCommoninfoBeanInfo(X31SDataBeanAccess commoninfoBean)
	{

		Map<String, Object> resultMap = new HashMap<String, Object>();

		// ○共有フォームBean.ＷＥＢ変更情報
		X31SDataBeanAccessArray subBeanArray = commoninfoBean.getDataBeanArray(CommonInfoCFConst.WEB_CHG_INFO);
		X31SDataBeanAccess webChgInfoBean = subBeanArray.getDataBean(0);

		// ○SSO情報Bean
		X31SDataBeanAccessArray ssoInfoBeanArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.SSO_INFO);
		X31SDataBeanAccess ssoInfoBean = ssoInfoBeanArray.getDataBean(0);

		// SSO情報取得
		String ssoInfoSysid = ssoInfoBean.sendMessageString(CommonInfoCFConst.SYSID_21, X31CWebConst.DATABEAN_GET_VALUE);

		// ○共有フォームBean.現顧客契約情報
		X31SDataBeanAccessArray genCustKeiInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO);
		X31SDataBeanAccess genCustKeiInfoBean = genCustKeiInfoArray.getDataBean(0);

		// ○共有フォームBean.サービス契約情報
		X31SDataBeanAccessArray svcKeiInfoArray = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess svcKeiInfoBean = svcKeiInfoArray.getDataBean(0);

		// ○共有フォームBean.サービス契約内訳情報
		X31SDataBeanAccessArray svcKeiUcwkInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO);
		X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiUcwkInfoArray.getDataBean(0);

		// ○共有フォームBean.オプションサービス契約情報
		X31SDataBeanAccessArray opSvcKeiInfoArray = svcKeiUcwkInfoBean.getDataBeanArray(CommonInfoCFConst.OP_SVC_KEI_INFO);

		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = null;

		// IPv6サービスの契約数
		int ipv6SprtCnt = 0;

		for (int m = 0; m < opSvcKeiInfoArray.getCount(); m++)
		{
			// オプションサービス契約情報（作業用）
			X31SDataBeanAccess tmpOpSvcKeiInfoBean = opSvcKeiInfoArray.getDataBean(m);

			// オプションサービスコード
			String opSvCd = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_CD_28, X31CWebConst.DATABEAN_GET_VALUE);
			// オプションサービスステータス
			String opSvcStat = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_STAT_28, X31CWebConst.DATABEAN_GET_VALUE);

			if (!JFUStrConst.CD00136_B070.equals(opSvCd))
			{
				// "B070"IPv6サービス以外の場合
				continue;
			}

			if (JFUStrConst.CD00037_910.equals(opSvcStat) || JFUStrConst.CD00037_920.equals(opSvcStat))
			{
				// 「910:解約済み」の場合、または、「920:キャンセル済」の場合
				continue;
			}

			// オプションサービス契約情報（確定）
			opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;

			// カウント
			ipv6SprtCnt++;

		}

		if (ipv6SprtCnt == 0)
		{
			// "B070"IPv6サービスのオプションサービスが存在しない場合
			// 解約対象オプション未契約エラー(0131)
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0131);
		}

		// ☆☆マップにセット☆
		resultMap.put(CommonInfoCFConst.SYSID_21, ssoInfoSysid);
		// ●Bean情報
		resultMap.put(CommonInfoCFConst.SSO_INFO, ssoInfoBean); // SSO情報
		resultMap.put(CommonInfoCFConst.SVC_KEI_INFO, svcKeiInfoBean); // サービス契約情報
		resultMap.put(CommonInfoCFConst.OP_SVC_KEI_INFO, opSvcKeiInfoBean); // オプションサービス契約情報

		return resultMap;
	}

	/**
	 * IPv6サービス解約申込(申込)サービス実行処理
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param serviceFormBean IPv6サービス解約申込サービスフォームBean
	 * @param funcCd 機能コード
	 * @throws Exception 
	 */
	private void executeDslService(final X31SDataBeanAccess commonInfoBean, final X31SDataBeanAccess serviceFormBean, String funcCd) throws Exception
	{
		DEBUG_LOG.info("----- FUW11601 Start executeDslService -----");

		// ●共有フォームBeanより現顧客契約情報を取得する。
		Map<String, Object> resultMap = getCommoninfoBeanInfo(commonInfoBean);
		// SSO情報
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.SSO_INFO);
		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);

		// ●サービス呼び出し処理
		// IPv6サービス申込（初期表示）サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0288);

		FUSV0288_FUSV0288OPDBMapper mapper = new FUSV0288_FUSV0288OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = { serviceFormBean, ssoInfoBean, opSvcKeiInfoBean };

		// 1.ネットオプションサービス契約取得CC(FUSV028901CC)
		dataMap = mapper.setFUSV028802CC_IPV6(paramBean, dataMap, funcCd);

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		try
		{
			// サービスの呼び出しを行う。
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 関連チェックを行う
			handleDslException(se);
		}

		// 機能コードが「1」の場合
		if (JPCModelConstant.FUNC_CD_1.equals(funcCd))
		{
			// 申込完了メール送信部品呼出処理
			JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW116_1);
		}
		DEBUG_LOG.info("----- FUW11601 End executeDslService -----");

	}

	/**
	 * 初期表示時例外ハンドリング処理
	 * <br/>
	 * 申込処理時に発生した業務例外のハンドリングを行ないます。
	 *
	 * @param jwse 初期処理時に発生したJCCWebServiceExceptionオブジェクト
	 * @throws JCCBusinessException この例外をフロント共通エラー処理に委譲する場合
	 */
	private void handleInitException(final JCCWebServiceException jwse) throws JCCBusinessException
	{
		// 例外情報を取得
		X31CMessageResult msgResult = jwse.getMessageList();
		X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
		// 関連チェック系は必ずエラーが1つのため0番目から取得する。
		X31CMessageMoreInfo info = moreInfo[0];
		String templateid = info.getTemplateId();
		String itemid = info.getItemId();
		String status = info.getStatus();
		String errFlg = info.getItemCheckErr();

		// 関連チェック
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{
			// -------------------------------------------------
			// ■予約チェック
			// -------------------------------------------------
			// エラー判定用テンプレートが"EKK1681B001"且つ エラーフラグが"EA"且つ アイテムIDがＫＥＹ＿異動区分の場合
			if (EKK1681B001.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && KEY_IDO_DIV.equals(itemid))
			{
				// 解約対象オプション未来予約エラー(0132)
				DEBUG_LOG.info("■■■解約対象オプション未来予約エラー(0132)");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0132);
			}

			// -------------------------------------------------
			// ■同月内解約チェック
			// -------------------------------------------------
			// エラー判定用テンプレートが"EKK0351B003"かつ エラーフラグが"EA"かつアイテムIDが当月申込エラーの場合
			if (EKK0351B003.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && THIS_MONTH_MSKM.equals(itemid))
			{
				DEBUG_LOG.info("■■■解約対象オプション当月受付済エラー(0136)");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0136); // "0136"：解約対象オプション当月受付済エラー
			}
		}

		// システムエラー(0002)
		DEBUG_LOG.info("■■■システムエラー(0002)");
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
	}

	/**
	 * 解約申し込み時例外ハンドリング処理
	 * <br/>
	 * 解約処理時に発生した業務例外のハンドリングを行ないます。
	 *
	 * @param jwse 申込処理時に発生したJCCWebServiceExceptionオブジェクト
	 * @throws JCCBusinessException この例外をフロント共通エラー処理に委譲する場合
	 */
	private void handleDslException(final JCCWebServiceException jwse) throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW11601 Start handleDslException -----");

		// 例外詳細情報を取得
		X31CMessageMoreInfo[] moreInfo = jwse.getMessageList().getMessageMoreInfoList();
		// メッセージ詳細情報クラスを取得
		// (単項目チェックエラーの発生有無を確認するだけなので、先頭レコードのみ処理する)
		X31CMessageMoreInfo info = moreInfo[0];

		String status = info.getStatus();
		String itemId = info.getItemId();
		String errFlg = info.getItemCheckErr();

		// ●関連チェック
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{

			// エラーフラグが"EA"の場合
			if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg))
			{
				// -------------------------------------------------
				// ■タイムスタンプチェック
				// -------------------------------------------------
				// "EA"かつアイテムが"更新年月日時分秒(更新前)"の場合
				if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemId))
				{
					// 更新不可エラー
					DEBUG_LOG.info("■■■タイムスタンプチェックエラー");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0204);
				}
			}
		}

		// その他のエラーは入力パラメータに起因しないエラーなので、システムエラー扱いとする。
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002); // "0002"：システムエラー
	}

	/**
	 * 初期表示時のエラーチェック処理です。
	 * 
	 * <br>
	 * @param commonInfoBean 共有フォームBean
	 */
	private void chkInit(X31SDataBeanAccess commonInfoBean)
	{
		DEBUG_LOG.info("----- FUW11601 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("----- FUW11601 End chkInit -----");
	}
}
