/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0021KRCK
*   ソースファイル名：JKKejbKK0021KRCK.java
*   作成者          ：富士通
*   日付            ：2011年04月21日
*＜機能概要＞
*   申込明細の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/04/21  富士通      新規作成
*
**********************************************************************/

package eo.ejb.common.entity;

import java.util.ArrayList;

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.ejb.cbm.entity.KK0021ETMsg;
import eo.ejb.cbm.entity.KK0021LE;
import eo.ejb.common.db.JKKejbKK0021DBABase;

/**
 * <p>
 * 申込明細の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0021KRCK extends JKKejbKK0021DBABase
{

	/** 無効フラグ（有効） */
	private static final String MK_FLG_YUKO = "0";

	/**
	 * <p>
	 * 新しいJKKejbKK0021KRCKを作成します。
	 * </p>
	 */
	public JKKejbKK0021KRCK()
	{
		super();
	}

	/**
	 * <p>
	 * 申込明細のタイムスタンプチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return カレントレコードの更新年月日時分秒とパラメータが一致する場合はtrue。
	 * 			一致しない場合はfalse。
	 */
	public boolean isModifiedTimestamp(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		CAANMsg inETMsg = new CAANMsg(KK0021ETMsg.class.getName());
		inETMsg.set(KK0021ETMsg.MSKM_DTL_NO, inMsg.getString(KK0021ETMsg.MSKM_DTL_NO));

		CAANMsg outETMsg = super.findByCurrent(inETMsg);

		if (inMsg.getString(KK0021ETMsg.UPD_DTM).equals(outETMsg.getString(KK0021ETMsg.UPD_DTM)))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * <p>
	 * 申込明細の存在チェックを行います。
	 * </p>
	 * @param mskmDtlNo 申込明細番号
	 * @param gene_add_dtm 世代登録年月日時分秒
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExists(String mskmDtlNo, String gene_add_dtm)
	{
		if( mskmDtlNo == null || "".equals(mskmDtlNo) || 
				gene_add_dtm == null || "".equals(gene_add_dtm)	)
		{
			return true;
		}

		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0021ETMsg.class.getName());
		msg.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);
		msg.set(KK0021ETMsg.GENE_ADD_DTM,gene_add_dtm);

		// ロジカルエンティティ生成
		KK0021LE le = new KK0021LE();

		CAANMsg rsltmsg = le.findByPrimaryKey(msg);

		//存在しない場合
		if (rsltmsg == null)
		{
			return false;
		}

		//存在する場合
		return true;
	}

	/**
	 * <p>
	 * 申込明細の未存在チェックを行います。
	 * </p>
	 * @param mskmDtlNo 申込明細番号
	 * @param gene_add_dtm 世代登録年月日時分秒
	 * @return PK検索でレコードが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isNonExists(String mskmDtlNo, String gene_add_dtm)
	{
		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0021ETMsg.class.getName());
		msg.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);
		msg.set(KK0021ETMsg.GENE_ADD_DTM,gene_add_dtm);

		// ロジカルエンティティ生成
		KK0021LE le = new KK0021LE();

		CAANMsg rsltmsg = le.findByPrimaryKey(msg);

		//存在しない場合
		if (rsltmsg == null)
		{
			return true;
		}

		//存在する場合
		return false;
	}
	
	/**
	 * <p>
	 * 申込明細の存在チェックを行います。（世代登録年月日時分秒を除く有効なレコード）
	 * </p>
	 * @param mskmDtlNo 申込明細番号
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExistsNonGene(String mskmDtlNo)
	{
		if( mskmDtlNo == null || "".equals(mskmDtlNo))
		{
			return true;
		}
		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0021ETMsg.class.getName());
		msg.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);
		msg.set(KK0021ETMsg.MK_FLG, MK_FLG_YUKO);

		// ロジカルエンティティ生成
		KK0021LE le = new KK0021LE();

		try
		{
			CAANMsg[] rsltList = le.findByCondition(msg);

			//存在しない場合
			if (rsltList.length == 0)
			{
				return false;
			}

			//存在する場合
			return true;
		}
		catch (CAANException ex)
		{
			throw new CAANRuntimeException(ex);
		}
	}

	/**
	 * <p>
	 * 引数で設定された値をキーに申込明細のカレントデータを取得し、そのカレントの
	 * 値と入力の値が一致するかを確認する
	 * </p>
	 * @param itemValue 設定値
	 * @param dbClumn 内部スキーマ項目名
	 * @return true：一致するデータ有  false：一致するデータ無
	 */
	public boolean isExsistsItemValue(String itemValue, String dbClumn)
	{
		// 未設定の場合
		if (itemValue == null || itemValue.equals(""))
		{
			return false;
		}

		// 申込明細番号を取得する
		ArrayList<String> mkmsNoList = this.getKK0021MkmsNo(itemValue, dbClumn);
		
		// 検索結果が0件の場合
		if(mkmsNoList == null) {
			return false;
		}

		// 申込明細番号を元にカレントレコードを取得する
		for (int i = 0; i < mkmsNoList.size(); i++)
		{
			// 申込明細番号をキーに申込明細のカレントを取得する
			CAANMsg kk0021CurInfo = this.getKK0021CurrentData(mkmsNoList.get(i));

			// 検索結果が0件の場合戻る
			if (kk0021CurInfo == null)
			{
				continue;
			}
			// 入力項目の値とカレントの入力項目の値で一致するデータがあればエラー
			if (itemValue.equals(kk0021CurInfo.getString(dbClumn)))
			{
				return true;
			}
		}
		return false;
	}
	
	/**
	 * <p>
	 * 引数で設定された項目をキーに申込明細番号を取得する
	 * </p>
	 * @param itemValue 設定値
	 * @param dbClumn   内部スキーマ項目名
	 * @return 申込明細番号
	 */
	private ArrayList<String> getKK0021MkmsNo(String itemValue, String dbClumn)
	{
		// 返却用リスト
		ArrayList<String> mkmsNoList = new ArrayList<String>();

		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0021ETMsg.class.getName());
		msg.set(dbClumn, itemValue);
		msg.set(KK0021ETMsg.MK_FLG, MK_FLG_YUKO);

		try
		{
			CAANMsg[] rsltList = new KK0021LE().findByCondition(msg);

			// 存在しない場合
			if (rsltList.length == 0)
			{
				return null;
			}

			// 検索結果の数繰り返し
			for (int i = 0; i < rsltList.length; i++)
			{
				// 申込明細番号を取得
				String mkmsNo = rsltList[i].getString(KK0021ETMsg.MSKM_DTL_NO);

				// 申込明細番号が重複する場合はリストに詰めないで戻る
				if (mkmsNoList.contains(mkmsNo))
				{
					continue;
				}
				// 申込明細番号を詰める
				mkmsNoList.add(mkmsNo);
			}
			return mkmsNoList;
		}
		catch (CAANException ex)
		{
			throw new CAANRuntimeException(ex);
		}
	}
	
	/**
	 * <p>
	 * 申込明細番号をキーにカレントデータを取得します
	 * </p>
	 * @param mskmDtlNo 申込明細番号
	 * @return 申込明細カレントデータ
	 */
	private CAANMsg getKK0021CurrentData(String mskmDtlNo)
	{
		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0021ETMsg.class.getName());
		msg.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);

		CAANMsg result = super.findByCurrent(msg);

		// 検索結果が0件の場合
		if (result == null)
		{
			return null;
		}
		return result;
	}
	
	/**
	 * <p>
	 * 申込書番号重複チェック
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param mskmshoNo 申込書番号
	 * @return 申込書番号が既に存在する場合、falseを返却
	 */
	public boolean chkMskshoNo(CAANMsg inMsg, AgentDispatchContext inContext, String mskmshoNo)
	{

		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0021ETMsg.class.getName());
		msg.set(KK0021ETMsg.MSKMSHO_NO, mskmshoNo);
		msg.set(KK0021ETMsg.MK_FLG, MK_FLG_YUKO);

		try
		{
			CAANMsg[] rsltList = new KK0021LE().findByCondition(msg);

			// 存在しない場合
			if (rsltList.length == 0)
			{
				return true;
			}
		}
		catch (CAANException ex)
		{
			throw new CAANRuntimeException(ex);
		}

		return false;
	}
}
