/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbIdoRestrictRule
*	ソースファイル名：JKKejbIdoRestrictRule.java
*	作成者			：富士通
*	日付			：2011年11月22日
*＜機能概要＞
*	異動可否チェックの相関ルール呼出クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/11/22	FJ)			新規作成
*	v5.00.00	2013/03/12	FJ）竹内	ANK-1429-00-00
*	v5.00.01	2013/05/23	FJ）寺園	IKK-2013-0001131
*
**********************************************************************/

package eo.ejb.common.entity;

import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANMsg;

import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKejbBusinessException;
import eo.ejb.common.rule.JKKejbRule00840xx;
import eo.ejb.common.rule.JKKejbRule0085001;
import eo.ejb.common.rule.JKKejbRule0085002;
import eo.ejb.common.rule.JKKejbRule0085003;
import eo.ejb.common.rule.JKKejbRule0085004;

/**
 * <p>
 * 異動可否チェックの相関ルール呼出クラスです。
 * </p>
 * @author 富士通
 */
public abstract class JKKejbIdoRestrictRule extends JKKejbIdoRestrictCheck
{

	/** 異動可否判定相関ルールインスタンス */
	private JKKejbRule00840xx rule0084 = null;

	/** 異動区分変換定義相関ルールインスタンス */
	private JKKejbRule0085001 rule0085001 = null;

	/** 異動区分詳細変換定義相関ルールインスタンス */
	private JKKejbRule0085002 rule0085002 = null;

	/** 既にある予約への変換定義相関ルールインスタンス */
	private JKKejbRule0085003 rule0085003 = null;

	/** 対象コンテンツ判定相関ルールインスタンス */
	private JKKejbRule0085004 rule0085004 = null;

	/**
	 * <p>
	 * 【異動予約】異動可否判定
	 * 異動可否判定の相関ルールにより、異動登録可能かチェックを行います。
	 * 相関ルールの実行結果で個別チェックが返却された場合は、
	 * 指定されたチェック処理の結果を返却します。
	 * </p>
	 * @param inETMsg チェック対象の異動予約
	 */
	public void execRule0084(CAANMsg inETMsg)
	{
		rule0084 = new JKKejbRule00840xx(inCBSMsg, getContents_def());

		// パラメータの設定
		rule0084.setRsv_hanei_tmg(getIdoHaneiTiming(inETMsg.getString(KK1681ETMsg.RSV_APLY_YMD)));
		rule0084.setExist_rsv(execRule0085003(inETMsg.getString(KK1681ETMsg.IDO_DIV), inETMsg.getString(KK1681ETMsg.IDO_RSV_DTL_CD)));

		// 異動可否判定を実行し結果を取得
		HashMap<String, Object> map = rule0084.execIdoKahi();
		String rsltCode = (String)map.get(JDG_RSLT_CD);
		String chkDetail = (String)map.get(CHK_DTL);
		String errorCode = (String)map.get(ERR_FLG);

		if (JDG_RSLT_CD_NORMAL.equals(rsltCode))
		{
			return;
		}

		if (JDG_RSLT_CD_ERROR.equals(rsltCode))
		{
			throw new JKKejbBusinessException(errorCode);
		}

		// 予約反映タイミングを保持しておく。
		super.setRsv_hanei_tmg(getIdoHaneiTiming(inETMsg.getString(KK1681ETMsg.RSV_APLY_YMD)));

		if (!isIndividualCheck(inETMsg, chkDetail))
		{
			throw new JKKejbBusinessException(errorCode);
		}
	}

	/**
	 * <p>
	 * 【住所変更予約】異動可否判定
	 * 異動可否判定の相関ルールにより、異動登録可能かチェックを行います。
	 * 相関ルールの実行結果で個別チェックが返却された場合は、
	 * 指定されたチェック処理の結果を返却します。
	 * </p>
	 * @param inETMsg チェック対象の住所変更明細
	 * @param rsvHaneiYmd 予約反映日
	 * @param existRsv 既にある予約
	 */
	public void execRule0084ForAdchgRsv(CAANMsg inETMsg, String rsvHaneiYmd, String existRsv)
	{
		rule0084 = new JKKejbRule00840xx(inCBSMsg, getContents_def());

		// パラメータの設定
		rule0084.setRsv_hanei_tmg(getIdoHaneiTiming(rsvHaneiYmd));
		rule0084.setExist_rsv(existRsv);

		// 異動可否判定を実行し結果を取得
		HashMap<String, Object> map = rule0084.execIdoKahi();
		String rsltCode = (String)map.get(JDG_RSLT_CD);
		String chkDetail = (String)map.get(CHK_DTL);
		String errorCode = (String)map.get(ERR_FLG);

		if (JDG_RSLT_CD_NORMAL.equals(rsltCode))
		{
			return;
		}

		if (JDG_RSLT_CD_ERROR.equals(rsltCode))
		{
			throw new JKKejbBusinessException(errorCode);
		}

		// 予約反映タイミングを保持しておく。
		super.setRsv_hanei_tmg(getIdoHaneiTiming(rsvHaneiYmd));

		if (!isIndividualCheck(inETMsg, chkDetail))
		{
			throw new JKKejbBusinessException(errorCode);
		}
	}

	/**
	 * <p>
	 * 異動区分変換定義の相関ルールを呼び出し、判定異動区分を設定します。
	 * </p>
	 */
	protected void execRule0085001()
	{
		rule0085001 = new JKKejbRule0085001(inCBSMsg);

		// パラメータの設定
		rule0085001.setTemplateID(getTemplateID());
		rule0085001.setIdo_div(getIdo_div());
		rule0085001.setMskm_sbt_cd(getMskmSbtCd());

		// 判定異動区分の取得
		String jdgIdoDiv = rule0085001.getJdgIdoDiv();

		if (jdgIdoDiv == null)
		{
			throw new JKKejbBusinessException();
		}

		// 判定異動区分の設定
		setJdg_ido_div(jdgIdoDiv);
	}

	/**
	 * <p>
	 * 異動区分詳細変換定義の相関ルールを呼び出し、異動区分詳細コードを設定します。
	 * </p>
	 */
	protected void execRule0085002()
	{
		rule0085002 = new JKKejbRule0085002(inCBSMsg);

		// パラメータの設定
		rule0085002.setJdg_ido_div(getJdg_ido_div());
		rule0085002.setTemplateID(getTemplateID());
		rule0085002.setKei_stat(getKei_stat());

		// 異動区分詳細コードの設定
		setIdo_div_dtl_cd(rule0085002.getIdoDivDtlCd());
	}

	/**
	 * <p>
	 * 既にある予約への変換定義の相関ルールを呼び出し、既にある予約を取得します。
	 * </p>
	 * @param idoDiv 異動区分
	 * @param idoRsvDtlCd 異動予約詳細コード
	 * @return 既にある予約
	 */
	protected String execRule0085003(String idoDiv, String idoRsvDtlCd)
	{
		rule0085003 = new JKKejbRule0085003(inCBSMsg);
		
		// パラメータの設定
		rule0085003.setIdo_div(idoDiv);
		rule0085003.setIdo_rsv_dtl_cd(idoRsvDtlCd);
		// 既にある予約の取得
		return rule0085003.getExistRsv();
	}

	/**
	 * <p>
	 * 対象コンテンツ判定の相関ルールを呼び出し、コンテンツIDを設定します。
	 * </p>
	 * @return コンテンツID
	 */
	protected void execRule0085004()
	{
		rule0085004 = new JKKejbRule0085004(inCBSMsg);

		// パラメータの設定
		rule0085004.setJdg_ido_div(getJdg_ido_div());
		rule0085004.setIdo_div_dtl_cd(getIdo_div_dtl_cd());
		rule0085004.setSvc_cd(getSvc_cd());
		rule0085004.setPrc_grp_cd(getPrc_grp_cd());
		rule0085004.setWrib_type_cd(getWrib_type_cd());

		// コンテンツIDの取得
		String contentsDef = rule0085004.getContentsDef();

		if (contentsDef == null)
		{
			throw new JKKejbBusinessException();
		}

		// コンテンツIDの設定
		setContents_def(contentsDef);
	}

	/**
	 * <p>
	 * 異動反映タイミングを取得します。
	 * </p>
	 * @param rsvAplyYmd チェック対象となる異動予約の予約適用年月日
	 * @return 異動反映タイミング(A：即時、B：先行予約、C：後続予約)
	 */
	private String getIdoHaneiTiming(String rsvAplyYmd)
	{
		String ret = null;

		if (0 >= JKKModelCommon.subtractDay(getBaseDate(), getOpeDate()))
		{
			// 即時の場合(運用日付より過去日も即時)
			ret = IDO_HANEI_TMG_A;
		}
		else if (0 > JKKModelCommon.subtractDay(getBaseDate(), rsvAplyYmd))
		{
			// 先行予約の場合(同日は先行予約に含まない)
			ret = IDO_HANEI_TMG_B;
		}
		else
		{
			// 後続予約の場合(同日は後続予約に含む)
			ret = IDO_HANEI_TMG_C;
		}

		return ret;
	}

}
