/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbIdoRestrictController
*	ソースファイル名：JKKejbIdoRestrictController.java
*	作成者			：富士通
*	日付			：2011年11月21日
*＜機能概要＞
*	異動可否判定チェッククラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/11/21	FJ)			新規作成
*	v4.00.00	2013/01/23	FJ）藤本	IT1-2012-0002413
*	v5.00.00	2013/03/12	FJ）竹内	ANK-1429-00-00
*   v7.00.00    2013/11/18  FJ）沖田    ANK-1578-00-00
*
**********************************************************************/

package eo.ejb.common.entity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKejbBusinessException;

/**
 * <p>
 * 異動可否判定チェッククラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbIdoRestrictController extends JKKejbIdoRestrictRule
{

	/**
	 * <p>
	 * JKKejbIdoRestrictControllerクラスのコンストラクタです。
	 * </p>
	 * @param inMsg 処理対象のCBSMsg
	 */
	public JKKejbIdoRestrictController(CAANMsg inMsg)
	{
		super();
		this.inCBSMsg = inMsg;
		setOpeDate(JKKModelCommon.getOpeDate(inCBSMsg));
		setTemplateID(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY));
	}

	/**
	 * <p>
	 * 異動可否判定の相関ルールによる異動可否チェックを行います。
	 * </p>
	 * @return 異動登録可の場合はtrue、不可の場合はfalse
	 */
	public boolean isIdoKahi()
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbIdoRestrictController#isIdoKahi");

		// パラメータのログ出力
		traceLog();

		// 基準日付の設定
		if (getBaseDate() == null)
		{
			// 基準日付が設定されていない場合は初期値を設定
			setBaseDate(YMD_INIT);
		}

		try
		{
			// 対象データの設定
			setTargetData();
			// 相関ルールによる判定異動区分の設定
			execRule0085001();
			// 相関ルールによる異動区分詳細コードの設定
			execRule0085002();
			// 相関ルールによるコンテンツIDの設定
			execRule0085004();

			/* --------------------------------------------------
			 * 異動予約に対する異動可否判定
			 * -------------------------------------------------- */
			for (CAANMsg msg : idoRsvList)
			{
				// 異動可否チェックの実行
				execRule0084(msg);
			}

			/* --------------------------------------------------
			 * 住所変更予約に対する異動可否判定
			 * -------------------------------------------------- */
			for (HashMap<String, Object> map : adchgRsvList)
			{
				// 予約反映日
				String rsvHaneiYmd = (String)map.get(ADCHG_RSV_RSV_HANEI_YMD);
				// 既にある予約
				String existRsv = (String)map.get(ADCHG_RSV_EXIST_RSV);
				// チェック対象の住所変更明細
				CAANMsg adchgDtlMsg = (CAANMsg)map.get(ADCHG_RSV_ADCHG_DTL_MSG);
				
				// 異動可否チェックの実行
				execRule0084ForAdchgRsv(adchgDtlMsg, rsvHaneiYmd, existRsv);
			}

			return true;
		}
		catch (JKKejbBusinessException be)
		{
			String errorCode = be.getErrorCode();

			if (errorCode == null)
			{
				return true;
			}

			setErrFlg(errorCode);
			return false;
		}
	}

	/**
	 * <p>
	 * 対象識別コードに応じたデータ設定を行います。
	 * </p>
	 */
	private void setTargetData()
	{
		// 対象識別コードによるデータ設定
		if (TG_SKBT_CD_CK0011.equals(getTg_skbt_cd()))
		{
			// お客様のデータ設定
			setDataCK0011();
		}
		else if (TG_SKBT_CD_KK0081.equals(getTg_skbt_cd()))
		{
			// サービス契約のデータ設定
			setDataKK0081();
			// サービス契約配下の契約に紐付く異動予約の取得
			setKK0081ChildRsv();
		}
		else if (TG_SKBT_CD_KK0161.equals(getTg_skbt_cd()))
		{
			// サービス契約内訳のデータ設定
			setDataKK0161();
			// サービス契約内訳配下の契約に紐付く異動予約の取得
			setKK0161ChildRsv();
		}
		else if (TG_SKBT_CD_KK0321.equals(getTg_skbt_cd()))
		{
			// 課金先のデータ設定
			setDataKK0321();
		}
		else if (TG_SKBT_CD_KK0341.equals(getTg_skbt_cd()))
		{
			// 機器提供サービス契約のデータ設定
			setDataKK0341();
			// 機器提供サービス契約配下の契約に紐付く異動予約の取得
			setKK0341ChildRsv();
		}
		else if (TG_SKBT_CD_KK0351.equals(getTg_skbt_cd()))
		{
			// オプションサービス契約のデータ設定
			setDataKK0351();
			// オプションサービス契約配下の契約に紐付く異動予約の取得
			setKK0351ChildRsv();
		}
		else if (TG_SKBT_CD_KK0401.equals(getTg_skbt_cd()))
		{
			// サブオプションサービス契約のデータ設定
			setDataKK0401();
			// サブオプションサービス契約配下の契約に紐付く異動予約の取得
			setKK0401ChildRsv();
		}
		else if (TG_SKBT_CD_KK0451.equals(getTg_skbt_cd()))
		{
			// 割引サービス契約のデータ設定
			setDataKK0451();
		}
		else if (TG_SKBT_CD_KK0491.equals(getTg_skbt_cd()))
		{
			// 請求契約のデータ設定
			setDataKK0491();
		}
		else if (TG_SKBT_CD_KK2811.equals(getTg_skbt_cd()))
		{
			// 機器オプションサービス契約のデータ設定
			setDataKK2811();
			// 機器提供サービス契約配下の契約に紐付く異動予約の取得
			// TODO 機器オプションの異動予約から取得する必要がある？
//			setKK0341ChildRsv();
		}
	}

	/**
	 * <p>
	 * 入力メッセージを複製した別インスタンスのメッセージを生成します。
	 * </p>
	 * @param inMsg 複製元のメッセージ
	 * @return 複製された別インスタンスのメッセージ
	 */
	public CAANMsg createCopyMessage(CAANMsg inMsg)
	{
		// 入力メッセージと同じスキーマの別インスタンスを生成
		CAANMsg outMsg = new CAANMsg(inMsg.getSchemaName());

		// 入力メッセージのキー情報を取得
		HashMap<?, ?> inMap = inMsg.getHashMap();
		Iterator<?> ite = inMap.keySet().iterator();

		while (ite.hasNext())
		{
			// メッセージ内のデータを転記
			String key = (String)ite.next();
			outMsg.set(key, inMsg.getObject(key));
		}

		return outMsg;
	}

	/**
	 * <p>
	 * 異動予約(異動可否判定対象)取得処理
	 * </p>
	 * @return 対象識別コードに応じた異動予約
	 */
	public List<CAANMsg> getIdoRsvList()
	{
		setTargetData();
		
		return idoRsvList;
	}

	/**
	 * <p>
	 * 異動予約(全て)取得処理
	 * </p>
	 * @return 対象識別コードに応じた異動予約
	 */
	public List<CAANMsg> getAllIdoRsvList()
	{
		setTargetData();
		
		return allIdoRsvList;
	}

	/**
	 * <p>
	 * 住所変更予約取得処理
	 * </p>
	 * @return 対象識別コードに応じた住所変更予約
	 */
	public ArrayList<HashMap<String,Object>> getAdchgRsvList()
	{
		setTargetData();
		
		return adchgRsvList;
	}

}
