/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUFamipaRelationalCheckCC
*   ソースファイル名：JFUFamipaRelationalCheckCC.java
*   作成者          ：富士通
*   日付            ：2011年10月24日
*＜機能概要＞
*   ファミリーパック関連チェックコモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/10/24   FJ）中谷    新規作成
*   v3.00       2012/03/28   FJ) 中谷    変更【ANK-0033-00-00】コース変更中のファミリーＰ申込受付
*   v3.00       2012/07/24   FJ) 中谷    変更【IT2-2012-0001292】上限適用回数が未設定の場合は最大契約数チェック実行しないよう修正。
*   v3.00       2012/10/14   FJ) 山名    変更【ST2-2012-0001775】プラン変更中ファミリーパック申込対応。
*   v5.00       2013/01/11   FJ）中谷    変更【ANK-1337-00-00】ベーシックギガルータ枯渇対応の切戻し
*   v5.00       2013/01/11   FJ）中谷    変更【ANK-1316-00-00】【R201105】ファミリーパック登録により異動対象のルーターが解約され、MN鳴動
*   
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0351B509CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B506CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B506CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0841A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0841A010CBSMsg1List;

/**
 * ファミリーパック関連チェックコモンコンポーネント部品
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUFamipaRelCheckCC extends JFUBaseNetChgRelCheckCC
{	
	/** IN項目:サービス契約番号 */
	private static final String IN_PARAM_KEY_SVC_KEI_NO = "key_svc_kei_no";
	/** IN項目:料金コースコード */
	private static final String IN_PARAM_KEY_PCRS_CD = "key_pcrs_cd";
	
	/** ファミリーパック契約上限 */
	private static final int FAMIPA_LIMIT = 1;
	
	/* ===== 最大契約数チェック ===== */
	/* ■□ 割引サービス一意照会SC ■□ */
	/** テンプレートID(割引サービス一意照会) */
	private static final String TEMPLATE_ID_3 = "EKK0841A010";
	/** テンプレートID(割引サービス一意照会明細) */
	private static final String TEMPLATE_ID_3_DETAIL = EKK0841A010CBSMsg.EKK0841A010CBSMSG1LIST;
	/** IN項目リスト(割引サービス一意照会) */
	private static final List<String> IN_COLUMN_LIST_3 =
			Arrays.asList(EKK0841A010CBSMsg.KEY_WRIB_SVC_CD, EKK0841A010CBSMsg.KEY_GENE_ADD_DTM, EKK0841A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(割引サービス一意照会) */
	private static final String ERROR_COLUMN_3 = EKK0841A010CBSMsg.KEY_WRIB_SVC_CD_ERR;
	/** SC実行結果取得キー(割引サービス一意照会) */
	private static final String TEMP_TEMPLATE_KEY_3 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_3 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/* ■□ 割引サービス契約(予約とカレント件数)一覧照会SC ■□ */
	/** テンプレートID(割引サービス契約(予約とカレント件数)一覧照会) */
	private static final String TEMPLATE_ID_4 = "EKK0451B506";
	/** テンプレートID(割引サービス契約(予約とカレント件数)一覧照会明細) */
	private static final String TEMPLATE_ID_4_DETAIL = EKK0451B506CBSMsg.EKK0451B506CBSMSG1LIST;
	/** IN項目リスト(割引サービス契約(予約とカレント件数)一覧照会) */
	private static final List<String> IN_COLUMN_LIST_4 =
			Arrays.asList(EKK0451B506CBSMsg.KEY_SYSID, EKK0451B506CBSMsg.KEY_SVC_KEI_NO, EKK0451B506CBSMsg.KEY_WRIB_SVC_CD);
	/** 関連チェックエラー項目(割引サービス契約(予約とカレント件数)一覧照会)(契約数超過) */
	private static final String ERROR_COLUMN_4_MAX_CNT = "max_kei_cnt_err";
	/** 関連チェックエラー項目(割引サービス契約(予約とカレント件数)一覧照会)(契約済) */
	private static final String ERROR_COLUMN_4_KEI_SUMI = "kei_sumi_err";
	/** SC実行結果取得キー(割引サービス契約(予約とカレント件数)一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_4 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_4 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ===== メール予約中チェック ===== */
	/* ■□ オプションサービス契約(予約件数)一覧照会SC ■□ */
	/** テンプレートID(オプションサービス契約(予約件数)一覧照会) */
	private static final String TEMPLATE_ID_5 = "EKK0351B509";
	/** テンプレートID(オプションサービス契約(予約件数)一覧照会明細) */
	private static final String TEMPLATE_ID_5_DETAIL = EKK0351B509CBSMsg.EKK0351B509CBSMSG1LIST;
	/** IN項目リスト(オプションサービス契約(予約件数)一覧照会) */
	private static final List<String> IN_COLUMN_LIST_5 = Arrays.asList(EKK0351B509CBSMsg.KEY_SVC_KEI_NO, EKK0351B509CBSMsg.KEY_OP_SVC_CD);
	/** 関連チェックエラー項目(オプションサービス契約(予約件数)一覧照会) */
	private static final String ERROR_COLUMN_5 = "mail_rsv_err";
	/** SC実行結果取得キー(オプションサービス契約(予約件数)一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_5 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_5 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/**
	 * ファミリーパック関連チェック実行処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite executeCheck(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{

		try
		{
			// ユーザデータ取得
			HashMap inMap = (HashMap)param.getData(fixedText);

			// IN項目:料金コースコード 
			String inParamPcrsCd = (String)inMap.get(IN_PARAM_KEY_PCRS_CD);
			// IN項目:サービス契約番号
			String inParamSvcKeiNo = (String)inMap.get(IN_PARAM_KEY_SVC_KEI_NO);

			/* ■□ 最大契約数チェック処理@ ■□ */
			// ●割引サービス一意照会
			// 上りマッピング
			setInMapWribSvcUniqueSearch(param, fixedText, JFUStrConst.KK0841_WRIB_SVC_CD_FAMIPA);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_3, TEMPLATE_ID_3_DETAIL, IN_COLUMN_LIST_3, ERROR_COLUMN_3);

			// 上限適用回数
			String upplAplycntStr = getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_3, TEMPLATE_ID_3_DETAIL, EKK0841A010CBSMsg1List.UPPL_APLY_CNT, 0);

			// 上限適用回数設定有
			if (!JFUBPCommon.isNull(upplAplycntStr))
			{
				// 上限適用回数
				int upplAplyCnt = Integer.parseInt(upplAplycntStr);

				// ●割引サービス契約(予約とカレント件数)一覧照会(SYSID)
				// 上りマッピング
				setInMapWribSvcKeiCntSearch(param, fixedText, JPCModelConstant.FUNC_CD_1);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_4, TEMPLATE_ID_4_DETAIL, IN_COLUMN_LIST_4, ERROR_COLUMN_4_MAX_CNT);

				// 契約数
				int contCnt =
						Integer.parseInt(getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_4), TEMPLATE_ID_4_DETAIL,
								EKK0451B506CBSMsg1List.CNT, 0));

				// 契約数上限チェック
				if (contCnt >= upplAplyCnt)
				{
					// 最大契約数超過エラー
					setRelationErrorInfo(param, TEMPLATE_ID_4, ERROR_COLUMN_4_MAX_CNT, fixedText);
					throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
							.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
				}
			}

			/* ■□ 契約済チェック処理D ■□ */
			// ●割引サービス契約(予約とカレント件数)一覧照会
			// 上りマッピング
			setInMapWribSvcKeiCntSearch(param, fixedText, JPCModelConstant.FUNC_CD_2);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_4, TEMPLATE_ID_4_DETAIL, IN_COLUMN_LIST_4, ERROR_COLUMN_4_KEI_SUMI);

			// 契約数
			int contSumiCnt =
					Integer.parseInt(getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_4), TEMPLATE_ID_4_DETAIL,
							EKK0451B506CBSMsg1List.CNT, 0));

			// 契約済チェック
			if (FAMIPA_LIMIT <= contSumiCnt)
			{
				// 契約済みエラー
				setRelationErrorInfo(param, TEMPLATE_ID_4, ERROR_COLUMN_4_KEI_SUMI, fixedText);
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
						.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}

			/* ■□ メール予約中チェック処理A ■□ */
			// ●オプションサービス契約(予約件数)一覧照会
			// 上りマッピング
			setInMapOpSvcRsvCntSearch(param, fixedText);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_5, TEMPLATE_ID_5_DETAIL, IN_COLUMN_LIST_5, ERROR_COLUMN_5);
			// メール予約中チェック
			if (Integer.parseInt(getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_5, TEMPLATE_ID_5_DETAIL, EKK0451B506CBSMsg1List.CNT, 0)) > 0)
			{
				// メール予約中エラー
				setRelationErrorInfo(param, TEMPLATE_ID_5, ERROR_COLUMN_5, fixedText);
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
						.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}

			// ●工事未完了チェック実行判定(ホーム・メゾン・マンション(光配線)が対象)
			boolean isExecUnderConstructionChk =
					JFUStrConst.CD00134_A03.equals(inParamPcrsCd) || JFUStrConst.CD00134_A04.equals(inParamPcrsCd)
							|| JFUStrConst.CD00134_A05.equals(inParamPcrsCd) || JFUStrConst.CD00134_A07.equals(inParamPcrsCd)
							|| JFUStrConst.CD00134_A08.equals(inParamPcrsCd) || JFUStrConst.CD00134_A09.equals(inParamPcrsCd)
							|| JFUStrConst.CD00134_A10.equals(inParamPcrsCd) || JFUStrConst.CD00134_A11.equals(inParamPcrsCd)
							|| JFUStrConst.CD00134_A56.equals(inParamPcrsCd) || JFUStrConst.CD00134_A57.equals(inParamPcrsCd)
							|| JFUStrConst.CD00134_A71.equals(inParamPcrsCd);

			if (isExecUnderConstructionChk)
			{
				/* ■□ 工事未完了チェック(ファミリーパック) ■□ */
				executeUnderConstructionChkFp(handle, param, fixedText);
				/* ■□ プラン変更収容替工事依頼の追加ルータ出荷指図済みチェック ■□ */
				setInMapRouterDirectionsCheck(param, fixedText, inParamPcrsCd, inParamSvcKeiNo);
				executeRouterDirectionsCheck(handle, param, fixedText, true);
			}
		}
		finally
		{
			// 一時領域削除
			super.deleteTempArea(param, fixedText);
		}
		return param;
	}

	/**
	 * チェック処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return チェック処理用マップ
	 * @throws Exception 
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * 上りマッピング項目設定(割引サービス一意照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wribSvcCd 割引サービスコード
	 * @throws RequestParameterException
	 */
	private void setInMapWribSvcUniqueSearch(IRequestParameterReadWrite param, String fixedText, String wribSvcCd) throws RequestParameterException
	{
		// 機能コード設定(2:カレント)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿割引サービスコード
		inMap.put(EKK0841A010CBSMsg.KEY_WRIB_SVC_CD, wribSvcCd);
		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK0841A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));

	}

	/**
	 * 上りマッピング項目設定(割引サービス契約(予約とカレント件数)一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param funcCd 機能コード
	 * @throws RequestParameterException
	 */
	private void setInMapWribSvcKeiCntSearch(IRequestParameterReadWrite param, String fixedText, String funcCd) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, funcCd);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿割引サービスコード
		inMap.put(EKK0451B506CBSMsg.KEY_WRIB_SVC_CD, JFUStrConst.KK0841_WRIB_SVC_CD_FAMIPA);
	}

	/**
	 * 上りマッピング項目設定(オプションサービス契約(予約件数)一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws RequestParameterException
	 */
	private void setInMapOpSvcRsvCntSearch(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿オプションサービスコード
		inMap.put(EKK0351B509CBSMsg.KEY_OP_SVC_CD, JFUStrConst.CD00136_B001);
	}

	/**
	 * 上りマッピング項目設定(プラン変更収容替工事依頼の追加ルータ出荷指図済みチェック)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapRouterDirectionsCheck(IRequestParameterReadWrite param, String fixedText, String pcrsCd, String svcKeiNo)
			throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 料金コースコード
		inMap.put(IN_PARAM_KEY_PCRS_CD, pcrsCd);
		// サービス契約番号
		inMap.put(IN_PARAM_KEY_SVC_KEI_NO, svcKeiNo);
	}
}
