/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0441KRCK
*   ソースファイル名：JKKejbKK0441KRCK.java
*   作成者          ：富士通
*   日付            ：2011年04月20日
*＜機能概要＞
*   請求オプションサービス契約の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/04/20  富士通      新規作成
*
**********************************************************************/

package eo.ejb.common.entity;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0441ETMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0441DBABase;

/**
 * <p>
 * 請求オプションサービス契約の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0441KRCK extends JKKejbKK0441DBABase
{

	/** 請求オプションサービス契約ステータス（サービス提供中） */
	private static final String SVC_KEI_STATUS_TEIKYO = "100";

	/** 請求オプションサービス契約ステータス（解約済） */
	private static final String SEIOPSVC_KEI_STAT_KAIYAKU = "910";

	/**
	 * <p>
	 * 新しいJSYejbKK0441KRCKを作成します。
	 * </p>
	 */
	public JKKejbKK0441KRCK()
	{
		super();
	}

	/**
	 * <p>
	 * 請求オプションサービス契約の予約レコードの存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 予約レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExistsReserve(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 予約検索用の請求オプションサービス契約の内部スキーマメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0441ETMsg.class.getName());
		inETMsg.set(KK0441ETMsg.SEIOPSVC_KEI_NO, inMsg.getString(KK0441ETMsg.SEIOPSVC_KEI_NO));
		inETMsg.set(KK0441ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 作成したメッセージを使用して予約検索を行う
		CAANMsg[] otETMsg = super.findByReserve(inETMsg);

		// 検索結果のメッセージの件数を判定し、以下の戻り値を返却
		// 1件以上の場合：true
		// 0件の場合	：false
		if (otETMsg.length >= 1)
		{
			return true;
		}

		return false;
	}

	/**
	 * <p>
	 * 請求オプションサービス契約の予約レコードが中止対象のレコードであることのチェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return キャンセル対象の予約レコードが存在する場合true。
	 *          それ以外の場合はfalse。
	 */
	public boolean isCheckRsvRecord(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 内部スキーマメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0441ETMsg.class.getName());

		// パラメータ設定
		inETMsg.set(KK0441ETMsg.SEIOPSVC_KEI_NO, inMsg.getString(KK0441ETMsg.SEIOPSVC_KEI_NO));
		inETMsg.set(KK0441ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 予約検索実行
		CAANMsg[] otETMsg = super.findByReserve(inETMsg);

		// 処理対象のレコードの世代登録年月日時分秒と一致するデータがあるか判定
		for (int i = 0; i < otETMsg.length; i++)
		{
			if (inMsg.getString(KK0441ETMsg.GENE_ADD_DTM).equals(otETMsg[i].getString(KK0441ETMsg.GENE_ADD_DTM)))
			{
				return true;
			}
		}

		return false;
	}

	/**
	 * <p>
	 * 請求オプションサービス契約の
	 * 親データ（１階層上の親）に解約予約が存在しないことのチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 解約済の親データ（１階層上の親）の予約が
	 *          存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isCheckSeiopSvkeiDslStp(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0441ETMsg.class.getName());
		inETMsg.set(KK0441ETMsg.SEIOPSVC_KEI_NO, inMsg.getString(KK0441ETMsg.SEIOPSVC_KEI_NO));
		inETMsg.set(KK0441ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 請求オプションサービス契約のカレント検索を行う
		CAANMsg ret0441 = new JKKejbKK0441DBABase().findByCurrent(inETMsg);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0441 == null)
		{
			return true;
		}

		// 検索用のメッセージを作成
		CAANMsg inETMsg0081 = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg0081.set(KK0081ETMsg.SVC_KEI_NO, ret0441.getString(KK0441ETMsg.SVC_KEI_NO));
		inETMsg0081.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サービス契約のカレント検索を行う
		CAANMsg[] ret0081 = new JKKejbKK0081DBABase().findByReserve(inETMsg0081);

		// 予約検索結果が0件の場合はtrueを返却
		if (ret0081.length == 0)
		{
			return true;
		}

		boolean isKayiyaku = false;

		for (int i = 0; i < ret0081.length; i++)
		{
			// 検索結果のサービス契約ステータスが"910"（解約済）の場合はfalseを返却して処理を終了する
			if (SEIOPSVC_KEI_STAT_KAIYAKU.equals(ret0081[i].getString(KK0081ETMsg.SVC_KEI_STAT)))
			{
				isKayiyaku = true;
				break;
			}
		}
		if (isKayiyaku)
		{
			return false;
		}
		else
		{
			// 上記条件以外の場合はtrueを返却する
			return true;

		}
	}

	/**
	 * <p>
	 * 請求オプションサービス契約の回復年月日時点で、
	 * 親データ（１階層上の親）がサービス提供中であることのチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 以下の契約のサービス提供中のデータが、指定された回復年月日時点で
	 *          存在する場合はtrue。存在しない場合はfalse。
	 *          ・サービス契約
	 */
	public boolean isCheckSeiopSvkeiKaihk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// サービス契約番号が設定されている場合は処理を行う
		if (!inMsg.isNull(KK0441ETMsg.SVC_KEI_NO))
		{
			// カレント検索用のメッセージを作成
			CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
			inETMsg.set(KK0081ETMsg.SVC_KEI_NO, inMsg.getString(KK0441ETMsg.SVC_KEI_NO));
			inETMsg.set(KK0081ETMsg.RSV_APLY_YMD, inMsg.getString(KK0441ETMsg.KAIHK_YMD));

			// サービス契約のカレント検索を行う
			CAANMsg ret0081 = new JKKejbKK0081DBABase().findByCurrent(inETMsg);

			// 検索結果がnullだった場合はfalseを返却
			if (ret0081 == null)
			{
				return false;
			}

			// 検索結果のサービス契約ステータスが"100"（サービス提供中）の場合はtrueを返却
			if (!SVC_KEI_STATUS_TEIKYO.equals(ret0081.getString(KK0081ETMsg.SVC_KEI_STAT)))
			{
				return false;
			}
		}

		// 上記条件以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * 請求オプションサービス契約で自データの解約予約日より未来日の
	 * 予約レコードが存在しないことのチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 指定されたサービス解約年月日以降の予約レコードが
	 *          存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isCheckSeiopSvkeiDslRsv(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 内部スキーマメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0441ETMsg.class.getName());

		// パラメータ設定
		inETMsg.set(KK0441ETMsg.SEIOPSVC_KEI_NO, inMsg.getString(KK0441ETMsg.SEIOPSVC_KEI_NO));
		inETMsg.set(KK0441ETMsg.RSV_APLY_YMD, inMsg.getString(KK0441ETMsg.SVC_DSL_YMD));

		// 予約検索実行
		CAANMsg[] otETMsg = super.findByReserve(inETMsg);

		// 件数の判定
		if (0 == otETMsg.length)
		{
			return true;
		}

		return false;
	}

}
