/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0891KRCK
*   ソースファイル名：JKKejbKK0891KRCK.java
*   作成者          ：富士通
*   日付            ：2011年04月20日
*＜機能概要＞
*   提供方式契約の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/04/20  富士通      新規作成
*   v5.00.00    2013/08/30  FJ)沖田     OM-2013-0001166
*
**********************************************************************/

package eo.ejb.common.entity;

import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0591ETMsg;
import eo.ejb.cbm.entity.KK0591LE;
import eo.ejb.cbm.entity.KK0891ETMsg;
import eo.ejb.cbm.entity.KK0891LE;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0891DBABase;

/**
 * <p>
 * 提供方式契約の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0891KRCK
{

	/** 無効フラグ（有効） */
	private static final String MK_FLG_YUKO = "0";

	/** 同日指定：含まない */
	private static final String NO_INC_DATE = "0";
	
	/** 可否（否） */
	private static final String KH_H = "0";
	
	/** eo光ネット料金プラン体系識別コード: 従量制 */
	private static final String EOHNT_PPLAN_TIKI_SKCD_JURYO = "1";

	
	/**
	 * <p>
	 * 新しいJKKejbKK0891KRCKを作成します。
	 * </p>
	 */
	public JKKejbKK0891KRCK()
	{
		super();
	}

	/**
	 * <p>
	 * 提供方式契約の存在チェックを行います。
	 * </p>
	 * @param tkHoshikiKeiNo 提供方式契約番号
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExists(String tkHoshikiKeiNo)
	{
		if (tkHoshikiKeiNo == null || "".equals(tkHoshikiKeiNo))
		{
			return true;
		}

		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0891ETMsg.class.getName());
		msg.set(KK0891ETMsg.TK_HOSHIKI_KEI_NO, tkHoshikiKeiNo);

		// ロジカルエンティティ生成
		KK0891LE le = new KK0891LE();

		CAANMsg rsltmsg = le.findByPrimaryKey(msg);

		//存在しない場合
		if (rsltmsg == null)
		{
			return false;
		}

		//存在する場合
		return true;
	}

	/**
	 * <p>
	 * 提供方式契約の未存在チェックを行います。
	 * </p>
	 * @param tkHoshikiKeiNo 提供方式契約番号
	 * @return PK検索でレコードが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isNonExists(String tkHoshikiKeiNo)
	{
		if (tkHoshikiKeiNo == null || "".equals(tkHoshikiKeiNo))
		{
			return true;
		}

		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0891ETMsg.class.getName());
		msg.set(KK0891ETMsg.TK_HOSHIKI_KEI_NO, tkHoshikiKeiNo);

		// ロジカルエンティティ生成
		KK0891LE le = new KK0891LE();

		CAANMsg rsltmsg = le.findByPrimaryKey(msg);

		//存在しない場合
		if (rsltmsg == null)
		{
			return true;
		}

		//存在する場合
		return false;
	}

	/**
	 * <p>
	 * 提供方式契約の存在チェックを行います。（有効なレコード）
	 * </p>
	 * @param tkHoshikiKeiNo 提供方式契約番号
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExistsYuko(String tkHoshikiKeiNo)
	{
		if (tkHoshikiKeiNo == null || "".equals(tkHoshikiKeiNo))
		{
			return true;
		}

		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0891ETMsg.class.getName());
		msg.set(KK0891ETMsg.TK_HOSHIKI_KEI_NO, tkHoshikiKeiNo);
		msg.set(KK0891ETMsg.MK_FLG, MK_FLG_YUKO);

		// ロジカルエンティティ生成
		KK0891LE le = new KK0891LE();

		try
		{
			CAANMsg[] rsltList = le.findByCondition(msg);

			//存在しない場合
			if (rsltList.length == 0)
			{
				return false;
			}

			//存在する場合
			return true;
		}
		catch (CAANException ex)
		{
			throw new CAANRuntimeException(ex);
		}
	}

	/**
	 * マンション従量制可否チェック処理
	 * <p>
	 * 提供方式契約番号に紐付く提供方式契約の「eo光ネット従量プラン申込可否」が"0"(否)である且
	 * 料金コースコード・料金グループコードに紐付く料金プランの「eo光ネット料金プラン体系識別コード」が"1"(従量制)の場合、エラー
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param prcsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @return 提供方式契約の「eo光ネット従量プラン申込可否」が"0"(否)でない又は
	 *          有効な料金プランの「eo光ネット料金プラン体系識別コード」が"1"(従量制)でない場合、true
	 *          上記以外の場合、false
	 */
	public boolean isMansJuryoseiKahiChk(CAANMsg inMsg, AgentDispatchContext inContext, Object prcsCd, Object pplanCd)
	{
		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		try
		{
			// ETメッセージ
			CAANMsg inKK0891ETMsg = new CAANMsg(KK0891ETMsg.class.getName());
			inKK0891ETMsg.set(KK0891ETMsg.TK_HOSHIKI_KEI_NO, inMsg.getString(KK0891ETMsg.TK_HOSHIKI_KEI_NO));
			inKK0891ETMsg.set(KK0891ETMsg.MK_FLG, MK_FLG_YUKO);
			inKK0891ETMsg.set(KK0891ETMsg.EOHNT_JURYO_PLAN_MKM_KH, KH_H);

			// ロジカルエンティティ生成
			KK0891LE kk891le = new KK0891LE();

			// 提供方式契約より、提供方式契約番号に紐付く「eo光ネット従量プラン申込可否」が"0"(否)のレコードを取得する
			CAANMsg[] outKK0891ETMsg = kk891le.findByCondition(inKK0891ETMsg);

			//存在しない場合、trueを返却する
			if (null == outKK0891ETMsg || outKK0891ETMsg.length == 0)
			{
				return true;
			}

			// ETメッセージ
			CAANMsg inKK0591ETMsg = new CAANMsg(KK0591ETMsg.class.getName());
			inKK0591ETMsg.set(KK0591ETMsg.PCRS_CD, prcsCd);
			inKK0591ETMsg.set(KK0591ETMsg.PPLAN_CD, pplanCd);
			inKK0591ETMsg.set(KK0591ETMsg.MK_FLG, MK_FLG_YUKO);
			inKK0591ETMsg.set(KK0591ETMsg.EOHNT_PPLAN_TIKI_SKCD, EOHNT_PPLAN_TIKI_SKCD_JURYO);

			// ロジカルエンティティ生成
			KK0591LE kk591le = new KK0591LE();

			// 料金プランより、料金コースコード・料金プランコードにに紐付く
			// 「eo光ネット料金プラン体系識別コード」が"1"(従量制)のレコードを取得する
			CAANMsg[] outKK0591ETMsg = kk591le.findByCondition(inKK0591ETMsg);

			//存在しない場合、trueを返却する
			if (null == outKK0591ETMsg || outKK0591ETMsg.length == 0)
			{
				return true;
			}

			// 料金プラン適用開始年月日が運用日付よりも未来である場合、trueを返却する
			if (JPCUtilCommon.isFutureDate(outKK0591ETMsg[0].getString(KK0591ETMsg.PPLAN_TSTAYMD), opeDate, NO_INC_DATE))
			{
				return true;
			}

			// 料金プラン適用終了年月日が運用日付よりも過去である場合、trueを返却する
			if (JPCUtilCommon.isPastDate(outKK0591ETMsg[0].getString(KK0591ETMsg.PPLAN_TENDYMD), opeDate, NO_INC_DATE))
			{
				return true;
			}
		}
		catch (CAANException ex)
		{
			throw new CAANRuntimeException(ex);
		}

		// 上記以外の場合、falseを返却する
		return false;
	}
	

	/**
	 * <p>
	 * マンション提供ステータスコードチェック処理
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 対象契約に紐付く提供方式契約.マンション提供ステータスコードが"物件導入保留中"以降の場合はfalse。
	 *          上記以外の場合はtrue。
	 */
	public boolean isChkMansTkStatCd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 対象の「サービス契約」のカレントを取得する。
		CAANMsg svcKeiInfo = new JKKejbKK0081DBABase().getKK0081Current(inMsg.getString(KK0081ETMsg.SVC_KEI_NO), JKKModelCommon.getOpeDate(inMsg));

		// 料金グループコードが"ｅｏ光ネットマンションタイプ"、"ｅｏ光電話"以外の場合、チェック対象外
		String prcGrpCd = svcKeiInfo.getString(KK0081ETMsg.PRC_GRP_CD);
		if (!JKKModelConst.PRC_GRP_CD_EOHNT_MANS_TYPE.equals(prcGrpCd) && !JKKModelConst.PRC_GRP_CD_EOHTL.equals(prcGrpCd))
		{
			return true;
		}

		// マンション子契約でない(提供方式契約番号が設定されていない)場合、チェック対象外
		String tkHoshikiKeiNo = svcKeiInfo.getString(KK0081ETMsg.TK_HOSHIKI_KEI_NO);
		if (null == tkHoshikiKeiNo || "".equals(tkHoshikiKeiNo))
		{
			return true;
		}

		// 対象の「サービス契約」が指定する「提供方式契約」を取得する。
		CAANMsg kk0891Info = new JKKejbKK0891DBABase().getKK0891PrimaryInfo(tkHoshikiKeiNo);

		// マンション提供ステータスコードが"解約・回線廃止"の場合、エラー
		if (JKKModelConst.MANS_TK_STAT_DSL_KAISEN_HAISHI.equals(kk0891Info.getString(KK0891ETMsg.MANS_TK_STAT_CD)))
		{
			return false;
		}

		return true;
	}

}
