/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：FUW11501SFLogic
*	ソースファイル名：FUW11501SFLogic.java
*	作成者			：富士通
*	日付			：2015年01月22日
*＜機能概要＞
*	リモートサポートプラス解約申込のビューロジッククラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2015/01/22	FJ)中西		新規作成
*   v37.00		2018/02/16	FJ) 美濃原	ANK-3366-00-00】eo光設備卸対応
*
**********************************************************************/
package eo.web.webview.FUW11501SF;

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;

/**
 * リモートサポートプラス解約申込のビューロジッククラスです。
 *
 * <br>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW11501SFLogic extends JCCWebBusinessLogic
{

	/** サービスID：リモートサポートプラス解約申込(初期表示) */
	private static final String USECASE_ID_FUSV0289 = "FUSV0289";
	/** サービスID：リモートサポートプラス解約申込(解約) */
	private static final String USECASE_ID_FUSV0288 = "FUSV0288";

	/** オプションサービス契約予約チェック */
	private static final String EKK1681B001 = "EKK1681B001";

	/** ＫＥＹ＿異動区分（予約チェック） */
	private static final String KEY_IDO_DIV = "key_ido_div";

	/** 更新年月日時分秒(更新前) */
	private static final String UPD_DTM_BF = "upd_dtm_bf";

	/** 申込完了メール送信部品呼出機能ID */
	private static final String MSKM_FIN_MAIL_FUW115_1 = "FUW115_1";

	/**
	 * リモートサポートプラス申込画面の初期表示処理を行います。
	 * 
	 * @return 必ず true：正常終了
	 * @throws Exception
	 *             例外出力
	 */
	public boolean init() throws Exception
	{

		// -------------------------------------------------
		// ■設備卸チェック
		// -------------------------------------------------
		JFUWebCommon.checkOrosi(this);

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// -------------------------------------------------
		// ■リモートサポートプラス解約申込(初期表示)サービス実行
		// -------------------------------------------------
		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_FUW11501);

		return true;
	}

	/**
	 * リモートサポートプラス申込画面の確認ボタン押下時の処理を行います。
	 * 
	 * @return 必ず true:正常終了
	 * @throws Exception
	 *              例外出力
	 */
	public boolean cfm() throws Exception
	{

		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// -------------------------------------------------
		// ■リモートサポートプラス解約申込(申込)サービス実行
		// -------------------------------------------------
		executeDslService(commonInfoBean, serviceFormBean, JPCModelConstant.FUNC_CD_2);

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW11502);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW11502);

		return true;
	}

	/**
	 * リモートサポートプラス申込確認画面の 申し込むボタン押下時の処理を行います。<br>
	 * 
	 * @return 処理結果（必ずtrue:正常終了）
	 * @throws Exception
	 *             例外出力
	 */
	public boolean dsl() throws Exception
	{
		// -------------------------------------------------
		// ■使用フォームBeanの取得
		// -------------------------------------------------
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// -------------------------------------------------
		// ■リモートサポートプラス解約申込(申込)サービス実行
		// -------------------------------------------------
		executeDslService(commonInfoBean, serviceFormBean, JPCModelConstant.FUNC_CD_1);

		// -------------------------------------------------
		// ■遷移先画面の指定
		// -------------------------------------------------
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW11503);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW11503);

		return true;
	}

	/**
	 * リモートサポートプラス解約申込確認画面の 戻るボタン押下時の処理を行います。
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 *             例外出力
	 */
	public boolean back() throws Exception
	{

		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW11501);
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW11501);

		return true;
	}

	/**
	 * リモートサポートプラス解約申込(初期表示)サービス実行処理
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param serviceFormBean リモートサポートプラス解約申込サービスフォームBean
	 * @throws Exception
	 */
	private void executeInitService(final X31SDataBeanAccess commonInfoBean, final X31SDataBeanAccess serviceFormBean) throws Exception
	{
		DEBUG_LOG.info("----- FUW11501 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);

		// ●サービス呼び出し処理
		// リモートサポートプラス申込（初期表示）サービスの呼び出しを行う。
		// ユースケース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_RS(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("----- FUW11501 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;

		// リモートサポートの契約数
		int rmtSprtCnt = 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_B021.equals(opSvCd))
			{
				// "B021"リモートサポートプラス以外の場合
				continue;
			}

			if (JFUStrConst.CD00037_910.equals(opSvcStat) || JFUStrConst.CD00037_920.equals(opSvcStat))
			{
				// 「910:解約済み」の場合、または、「920:キャンセル済」の場合
				continue;
			}

			// オプションサービス契約情報（確定）
			opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;

			// カウント
			rmtSprtCnt++;

		}

		if (rmtSprtCnt == 0)
		{
			// "B021"リモートサポートプラスのオプションサービスが存在しない場合
			// 解約対象オプション未契約エラー(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.OP_SVC_KEI_INFO, opSvcKeiInfoBean); // オプションサービス契約情報

		return resultMap;
	}

	/**
	 * リモートサポートプラス解約申込(申込)サービス実行処理
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param serviceFormBean リモートサポートプラス解約申込サービスフォームBean
	 * @param funcCd 機能コード
	 * @throws Exception 
	 */
	private void executeDslService(final X31SDataBeanAccess commonInfoBean, final X31SDataBeanAccess serviceFormBean, String funcCd) throws Exception
	{

		// ●共有フォーム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);

		// ●サービス呼び出し処理
		// リモートサポートプラス申込（初期表示）サービスの呼び出しを行う。
		// ユースケース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_RS(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_FUW115_1);
		}
	}

	/**
	 * 初期表示時例外ハンドリング処理
	 * <br/>
	 * 申込処理時に発生した業務例外のハンドリングを行ないます。
	 *
	 * @param jwse 初期処理時に発生したJCCWebServiceExceptionオブジェクト
	 */
	private void handleInitException(JCCWebServiceException jwse)
	{
		// 例外情報を取得
		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);
			}
		}

		// システムエラー(0002)
		DEBUG_LOG.info("■■■システムエラー(0002)");
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
	}

	/**
	 * 解約申し込み時例外ハンドリング処理
	 * <br/>
	 * 解約処理時に発生した業務例外のハンドリングを行ないます。
	 *
	 * @param jwse 申込処理時に発生したJCCWebServiceExceptionオブジェクト
	 */
	private void handleDslException(JCCWebServiceException jwse)
	{
		// 例外情報を取得
		X31CMessageResult msgResult = jwse.getMessageList();
		X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
		// 関連チェック系は必ずエラーが1つのため0番目から取得する。
		X31CMessageMoreInfo info = moreInfo[0];
		String itemid = info.getItemId();
		String status = info.getStatus();
		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);
	}

}
