/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：電子署名入力
*   ソースファイル名：FUW09905SFLogic.java
*   作成者          ：富士通
*   日付            ：2017年01月27日
*＜機能概要＞
*  電子署名入力のビューロジッククラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v29.00      2017/01/27   FJ）張本    ANK-3112-00-00_訪販タブレット
*   v53.00      2021/06/11   FJ) 西川    【ANK-4009-19-00】【CX戦略WG方針対応】FUIFE157のURL変更対応
**********************************************************************/

package eo.web.webview.FUW09905SF;

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.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CHashMap;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JFUStrConst;
import eo.common.util.JCCFrameworkException;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0303_FUSV0303OPDBMapper;
import eo.web.webview.mapping.FUSV0305_FUSV0305OPDBMapper;

/**
 * 電子署名入力のビューロジッククラスです。<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW09905SFLogic extends JCCWebBusinessLogic
{
	/** プロパティファイル取得文字列 */
	private static final String QUERY_DISPTEXT_PATH = "DISPSETTING/SETTING[@screenId='FUW09905']/DISPTEXT";
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";
	/** 属性名 */
	private static final String SIGNATURE_LENGTH = "SIGNATURE_LENGTH";

	/** サービスID */
	private static final String SERVICE_ID_FUSV0303 = "FUSV0303";
	/** サービスID */
	private static final String SERVICE_ID_FUSV0305 = "FUSV0305";
	/** 機能コード */
	private static final String FUNC_CD = "1";

	/** 外部連携パラメタ　申込書番号 */
	private static final String PRM_UK_NO = "UK_NO";
	/** 外部連携パラメタ　申込書種別コード */
	private static final String PRM_MSKMSHO_SBT_CD = "MSKMSHO_SBT_CD";
	/** 外部連携パラメタ　担当者ＩＤ */
	private static final String PRM_TANTOSHA_ID = "TANTOSHA_ID";

	/** 登録失敗時のメッセージID */
	private static final String ERR_MESSAGE_ID_ADD = "EKF0420-TW";
	/** 登録失敗時のメッセージエリア識別子 */
	private static final String ERR_SIGNATURE = "signature";
	/** 登録失敗時のメッセージ置換文字列 */
	private static final String[] ERR_MESSAGE_PARAM_ADD = new String[] { "正常に登録できませんでした。当画面を閉じて再度署名", "登録" };
	/** パラメタエラー時のメッセージID */
	private static final String ERR_MESSAGE_ID_PRM = "EKF1790-NW";
	/** パラメタエラー時のメッセージ置換文字列 */
	private static final String[] ERR_MESSAGE_PARAM_PRM = new String[] { "登録に必要な情報が存在しない", "登録" };

	/** メッセージ文言：１：署名なし */
	private static final String MNGN_DSP_1 = "1";
	/** メッセージ文言：２：署名あり */
	private static final String MNGN_DSP_2 = "2";
	/** メッセージ文言：３：登録完了 */
	private static final String MNGN_DSP_3 = "3";

	/**
	 * 初期表示処理 <BR>
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		// デバッグログ
		DEBUG_LOG.debug("----- init_FUW09905SFLogic Start -----");

		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// 共有フォームBean ＷＥＢ新規情報取得
		X31SDataBeanAccess webNewInfoBean = getDataBean(commonInfoBean.getDataBeanArray(CommonInfoCFConst.WEB_NEW_INFO));
		// ＷＥＢ新規情報 その他情報取得
		X31SDataBeanAccess elseInfoBean = getDataBean(webNewInfoBean.getDataBeanArray(CommonInfoCFConst.ELSE_INFO));
		// 契約サービス情報
		X31SDataBeanAccess keiSvcInfoBean = getDataBean(webNewInfoBean.getDataBeanArray(CommonInfoCFConst.KEIYAKU_SVC_INFO));
		// サービスフォームBean取得
		X31SDataBeanAccess serviceInfoBean = super.getServiceFormBean();

		// 遷移元画面IDを取得
		String beforeScreenId = commonInfoBean.sendMessageString(CommonInfoCFConst.BEFORE_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE);

		// 遷移先画面IDを取得
		String nextScreenId = commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE);

		if (JFUWebCommon.isNull(nextScreenId) || JFUScreenConst.SCREEN_ID_FUW00144.equals(beforeScreenId))
		{

			// ■リクエストパラメータを取得
			X31CHashMap requestParams = this.getRequestParams();

			// パラメタチェック
			if (!requestParams.containsKey(PRM_UK_NO) || !requestParams.containsKey(PRM_MSKMSHO_SBT_CD))
			{
				DEBUG_LOG.debug("■■■FUW09501 (1)電子署名入力：アクセスエラー■■■");
				// エラーメッセージを表示する。
				JCCWebCommon.setMessageInfo(this, ERR_MESSAGE_ID_PRM, ERR_MESSAGE_PARAM_PRM, ERR_SIGNATURE);
			}

			String mskmshoNo = (String)requestParams.get(PRM_UK_NO);
			String mskmshoSbtCd = (String)requestParams.get(PRM_MSKMSHO_SBT_CD);
			String tantoshaId = (String)requestParams.get(PRM_TANTOSHA_ID);

			if (JFUWebCommon.isNull(mskmshoNo) || JFUWebCommon.isNull(mskmshoSbtCd))
			{
				DEBUG_LOG.debug("■■■FUW09501 (1)電子署名入力：アクセスエラー■■■");
				// エラーメッセージを表示する。
				JCCWebCommon.setMessageInfo(this, ERR_MESSAGE_ID_PRM, ERR_MESSAGE_PARAM_PRM, ERR_SIGNATURE);
			}

			// 申込書番号を設定
			serviceInfoBean.sendMessageString(FUW09905SFConst.MSKMSHO_NO, X31CWebConst.DATABEAN_SET_VALUE, mskmshoNo);
			// 申込書種別コードを設定
			serviceInfoBean.sendMessageString(FUW09905SFConst.MSKMSHO_SBT_CD, X31CWebConst.DATABEAN_SET_VALUE, mskmshoSbtCd);
			// 担当者ＩＤを設定
			elseInfoBean.sendMessageString(CommonInfoCFConst.TANTOSHA_ID_18, X31CWebConst.DATABEAN_SET_VALUE, tantoshaId);

			// 遷移元画面IDを取得
			commonInfoBean.sendMessageString(CommonInfoCFConst.BEFORE_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.EMPTY);
		}
		else
		{
			// WEB新規情報 - 申込回線サービス (0:未定 1:ホームタイプ 2:マンションタイプ 3:モバイル単独)
			String mskmKsnSvc = webNewInfoBean.sendMessageString(CommonInfoCFConst.MSKM_KSN_SVC_06, X31CWebConst.DATABEAN_GET_VALUE);
			// WEB新規情報 - 申込マンションタイプ (0:未定 1:マンション 2:メゾン)
			String mskmMnsType = webNewInfoBean.sendMessageString(CommonInfoCFConst.MSKM_MNS_TYPE_06, X31CWebConst.DATABEAN_GET_VALUE);

			// 申込書番号を設定
			serviceInfoBean.sendMessageString(FUW09905SFConst.MSKMSHO_NO, X31CWebConst.DATABEAN_SET_VALUE, keiSvcInfoBean.sendMessageString(
					CommonInfoCFConst.MSKMSHO_NO_10, X31CWebConst.DATABEAN_GET_VALUE));
			// 申込書種別コードを設定
			if (JFUStrConst.MSKM_KSN_SVC_HOME.equals(mskmKsnSvc))
			{
				serviceInfoBean.sendMessageString(FUW09905SFConst.MSKMSHO_SBT_CD, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.CD00752_1);
			}
			else if (JFUStrConst.MSKM_MNS_TYPE_MANSION.equals(mskmMnsType))
			{
				serviceInfoBean.sendMessageString(FUW09905SFConst.MSKMSHO_SBT_CD, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.CD00752_2);
			}
			else if (JFUStrConst.MSKM_MNS_TYPE_MEZON.equals(mskmMnsType))
			{
				serviceInfoBean.sendMessageString(FUW09905SFConst.MSKMSHO_SBT_CD, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.CD00752_3);
			}

		}

		// -------------------------------------------------
		// サービス呼出処理
		// -------------------------------------------------
		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SERVICE_ID_FUSV0305);

		// DataBean-BPマッピング
		FUSV0305_FUSV0305OPDBMapper mapper = new FUSV0305_FUSV0305OPDBMapper();
		HashMap<String, HashMap<String, String>> inputMap = new HashMap<String, HashMap<String, String>>();
		// サービス処理結果格納用マップ
		HashMap<String, HashMap<String, ArrayList<HashMap<String, String>>>> outputMap =
				new HashMap<String, HashMap<String, ArrayList<HashMap<String, String>>>>();

		X31SDataBeanAccess[] paramBean = { serviceInfoBean };

		// 上りマッピング
		mapper.setFUSV030501SC(paramBean, inputMap, FUNC_CD);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 業務用例外クラスをthrowしない。
			DEBUG_LOG.debug("■■■FUW09501 (1)電子署名入力：業務用例外発生■■■");
		}

		// 下りマッピング
		mapper.getFUSV030501SC(paramBean, outputMap);

		// メッセージ文言を設定
		if (JFUWebCommon.isNull(serviceInfoBean.sendMessageString(FUW09905SFConst.ESIGN_IMG, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			serviceInfoBean.sendMessageString(FUW09905SFConst.MSG_MNGN_DSP_KBN, X31CWebConst.DATABEAN_SET_VALUE, MNGN_DSP_1);
		}
		else
		{
			serviceInfoBean.sendMessageString(FUW09905SFConst.MSG_MNGN_DSP_KBN, X31CWebConst.DATABEAN_SET_VALUE, MNGN_DSP_2);
		}

		// -------------------------------------------------
		// 遷移先画面ID、画面名の設定
		// -------------------------------------------------
		// 電子署名入力画面に遷移
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW09905);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW09905);

		// デバッグログ
		DEBUG_LOG.debug("----- init_FUW09905SFLogic End -----");
		return true;
	}

	/**
	 * 登録するボタン押下処理 <BR>
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean add() throws Exception
	{

		// デバッグログ
		DEBUG_LOG.debug("----- add_FUW09905SFLogic Start -----");

		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBean取得
		X31SDataBeanAccess serviceInfoBean = super.getServiceFormBean();

		// プロパティを取得
		Map<String, String> fuDispDefinitionMap = JFUWebCommon.getDispItemsAsMap(QUERY_DISPTEXT_PATH, QUERY_ATTR_NAME);
		// 署名桁数チェック
		int sigLen = Integer.parseInt(fuDispDefinitionMap.get(SIGNATURE_LENGTH));
		String signature = serviceInfoBean.sendMessageString(FUW09905SFConst.SIGNATURE, X31CWebConst.DATABEAN_GET_VALUE);
		if (signature.length() > sigLen)
		{
			// エラーメッセージを表示する。
			JCCWebCommon.setMessageInfo(this, ERR_MESSAGE_ID_ADD, ERR_MESSAGE_PARAM_ADD, ERR_SIGNATURE);
			return true;
		}

		// -------------------------------------------------
		// サービス呼出処理
		// -------------------------------------------------
		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SERVICE_ID_FUSV0303);

		// DataBean-BPマッピング
		FUSV0303_FUSV0303OPDBMapper mapper = new FUSV0303_FUSV0303OPDBMapper();
		HashMap<String, HashMap<String, String>> inputMap = new HashMap<String, HashMap<String, String>>();
		// サービス処理結果格納用マップ
		HashMap<String, HashMap<String, ArrayList<HashMap<String, String>>>> outputMap =
				new HashMap<String, HashMap<String, ArrayList<HashMap<String, String>>>>();

		X31SDataBeanAccess[] paramBean = { serviceInfoBean };

		// 上りマッピング
		mapper.setFUSV030301SC(paramBean, inputMap, FUNC_CD, this);
		mapper.setFUSV030302SC(paramBean, inputMap, FUNC_CD, this);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// エラーメッセージを表示する。
			JCCWebCommon.setMessageInfo(this, ERR_MESSAGE_ID_ADD, ERR_MESSAGE_PARAM_ADD, ERR_SIGNATURE);
			return true;
		}
		catch (JCCFrameworkException fe)
		{
			// エラーメッセージを表示する。
			JCCWebCommon.setMessageInfo(this, ERR_MESSAGE_ID_ADD, ERR_MESSAGE_PARAM_ADD, ERR_SIGNATURE);
			return true;
		}

		// 下りマッピング
		mapper.getFUSV030301SC(paramBean, outputMap);
		mapper.getFUSV030302SC(paramBean, outputMap);

		// 電子署名イメージを設定
		serviceInfoBean.sendMessageString(FUW09905SFConst.ESIGN_IMG, X31CWebConst.DATABEAN_SET_VALUE, serviceInfoBean.sendMessageString(
				FUW09905SFConst.SIGNATURE, X31CWebConst.DATABEAN_GET_VALUE));
		// メッセージ文言を設定
		serviceInfoBean.sendMessageString(FUW09905SFConst.MSG_MNGN_DSP_KBN, X31CWebConst.DATABEAN_SET_VALUE, MNGN_DSP_3);

		// -------------------------------------------------
		// 遷移先画面ID、画面名の設定
		// -------------------------------------------------
		// 電子署名入力画面に遷移
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW09905);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW09905);

		// デバッグログ
		DEBUG_LOG.debug("----- add_FUW09905SFLogic End -----");
		return true;
	}

	/**
	 * 共有フォームBeanの情報を取得
	 * 
	 * @param arr 取得元のデータBean
	 * @return bn 取得したデータBean
	 */
	private X31SDataBeanAccess getDataBean(X31SDataBeanAccessArray arr)
	{
		if (arr.getCount() == 0)
		{
			arr.addDataBean();
		}
		X31SDataBeanAccess bn = arr.getDataBean(0);

		return bn;
	}
}
