/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUOpChannelDbleCheckCC
*   ソースファイル名：JFUOpChannelDbleCheckCC.java
*   作成者          ：富士通
*   日付            ：2012年4月27日
*＜機能概要＞
*   オプションチャネル重複コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v3.00       2012/04/27   FJ）南岡   【ANK-0281-00-00】 基本コース・オプションCH組合せチェック
*   v4.00       2012/08/28   FJ)美濃原  【ANK-0531-00-00】 TVオプションＣｈ重複チェック
*	v4.00       2012/10/12   FJ)美濃原  【IT1-2012-0001463】相関チェック開始、終了年月日のチェックを修正
*   v5.00       2013/02/14   FJ)瀧澤    【IT1-2013-0000277】静的変数の削除対応
*
**********************************************************************/
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.common.util.JPCUtilCommon;
import eo.ejb.cbs.cbsmsg.EKK0811A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0811A010CBSMsg1List;

/**
 * オプションチャネル重複コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUOpChannelDbleCheckCC extends JFUBaseNetChgRelCheckCC
{
	/* ===== パラメータ ===== */
	/** オプションサービスコード */
	private static final String PARAM_OP_SVC_CD = "op_svc_cd";
	/** 料金コースコード */
	private static final String PARAM_PCRS_CD = "pcrs_cd";

	/* ===== オプションチャネル重複チェック ===== */
	/* ■□ 料金コース_オプションサービス一意照会SC ■□ */
	/** テンプレートID(料金コース_オプションサービス一意照会) */
	private static final String TEMPLATE_ID_1 = "EKK0811A010";
	/** テンプレートID(料金コース_オプションサービス一意照会明細) */
	private static final String TEMPLATE_ID_1_DETAIL = EKK0811A010CBSMsg.EKK0811A010CBSMSG1LIST;
	/** IN項目リスト(料金コース_オプションサービス一意照会) */
	private static final List<String> IN_COLUMN_LIST_1 =
			Arrays.asList(EKK0811A010CBSMsg.KEY_PCRS_CD, EKK0811A010CBSMsg.KEY_OP_SVC_CD, EKK0811A010CBSMsg.KEY_RSV_APLY_YMD,
					EKK0811A010CBSMsg.KEY_GENE_ADD_DTM);
	/** 関連チェックエラー項目(料金コース_オプションサービス一意照会) */
	private static final String ERROR_COLUMN_1 = EKK0811A010CBSMsg.KEY_OP_SVC_CD_ERR;
	/** 関連チェックエラー項目(料金コース_オプションサービス一意照会(オプションチャンネル重複エラー)) */
	private static final String ERROR_COLUMN_1_OP_CHANNEL_DBLE = "op_svc_cd_err";
	/** SC実行結果取得キー(料金コース_オプションサービス一意照会) */
	private static final String TEMP_TEMPLATE_KEY_1 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_1 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/** 同日を含む／含まないの指定フラグ("1"：含む) */
	private static final String DOJITSU_HUKUMU = "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);

			// オプションサービスコード
			String opSvcCd = (String)inMap.get(PARAM_OP_SVC_CD);
			// 料金コースコード
			String pcrsCd = (String)inMap.get(PARAM_PCRS_CD);

			// -----------------------------------------------------
			// ■オプションチャンネル重複チェック
			// -----------------------------------------------------
			checkOpChannelDble(handle, param, fixedText, opSvcCd, pcrsCd);

		}
		finally
		{
			// 一時領域削除
			super.deleteTempArea(param, fixedText);
		}
		return param;
	}

	/**
	 * オプションチャンネル重複チェック処理を行います。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param opSvcCd オプションサービスコード
	 * @param pcrsCd 料金コースコード
	 * @throws Exception
	 */
	private void checkOpChannelDble(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String opSvcCd, String pcrsCd)
			throws Exception
	{

		// -----------------------------------------------------
		// ■料金コース_オプションサービス一意照会
		// -----------------------------------------------------
		// 上りマッピング
		setInMapPcrsOpChanellDbleSearch(param, fixedText, opSvcCd, pcrsCd);

		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_1, TEMPLATE_ID_1_DETAIL, IN_COLUMN_LIST_1, ERROR_COLUMN_1);

		// オプションチャンネル解約対象抽出フラグを取得
		String opDslTgChshtFlg =
				(String)(getTemplateList((HashMap)param.getData(fixedText), TEMP_TEMPLATE_KEY_1, TEMPLATE_ID_1_DETAIL).get(0)
						.get(EKK0811A010CBSMsg1List.OPCH_DSL_TG_CHSHT_FLG));

		// 相関チェック開始年月日、相関チェック終了年月日(オプションチャンネル解約対象抽出フラグが"1"の場合のみ日付がセットされる）
		// 期間外はオプションチャンネル解約対象抽出フラグをオフに設定する
		if (JFUStrConst.KK0811_OPCH_DSL_TG_CHSHT_FLG_1.equals(opDslTgChshtFlg))
		{
			String sokanChkStaYmd =
					(String)(getTemplateList((HashMap)param.getData(fixedText), TEMP_TEMPLATE_KEY_1, TEMPLATE_ID_1_DETAIL).get(0)
							.get(EKK0811A010CBSMsg1List.SOKAN_CHK_STAYMD));

			String sokanChkEndYmd =
					(String)(getTemplateList((HashMap)param.getData(fixedText), TEMP_TEMPLATE_KEY_1, TEMPLATE_ID_1_DETAIL).get(0)
							.get(EKK0811A010CBSMsg1List.SOKAN_CHK_ENDYMD));

			HashMap inMap = (HashMap)param.getData(fixedText);
			String rsvAplyYmd = (String)inMap.get(EKK0811A010CBSMsg.KEY_RSV_APLY_YMD);
			if (!((JPCUtilCommon.isPastDate(sokanChkStaYmd, rsvAplyYmd, DOJITSU_HUKUMU)) && (JPCUtilCommon.isPastDate(rsvAplyYmd, sokanChkEndYmd,
					DOJITSU_HUKUMU))))
			{
				opDslTgChshtFlg = JFUStrConst.KK0811_OPCH_DSL_TG_CHSHT_FLG_0;
			}
		}

		// -----------------------------------------------------
		// ■オプションチャンネル重複チェック
		// -----------------------------------------------------
		if (JFUStrConst.KK0811_OPCH_DSL_TG_CHSHT_FLG_1.equals(opDslTgChshtFlg))
		{
			// オプションチャンネル重複エラー
			setRelationErrorInfo(param, TEMPLATE_ID_1, ERROR_COLUMN_1_OP_CHANNEL_DBLE, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String.valueOf(RETURN_CODE_NORMAL),
					JPCModelConstant.RELATION_ERR);
		}
	}

	/**
	 * 上りマッピング項目設定(オプションチャンネル重複一覧照会)を行います。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param opSvcCd オプションサービスコード
	 * @param pcrsCd 料金コースコード
	 * @throws RequestParameterException
	 */
	private void setInMapPcrsOpChanellDbleSearch(IRequestParameterReadWrite param, String fixedText, String opSvcCd, String pcrsCd)
			throws RequestParameterException
	{

		// 機能コード設定(2:料金コース_オプションサービス一意照会(カレント))
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

		// リクエストパラメータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿オプションサービスコード
		inMap.put(EKK0811A010CBSMsg.KEY_OP_SVC_CD, opSvcCd);
		// ＫＥＹ＿料金コースコード
		inMap.put(EKK0811A010CBSMsg.KEY_PCRS_CD, pcrsCd);
		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK0811A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));

	}

	/**
	 * チェック処理を行います。
	 * 
	 * <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;
	}
}
