/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0171DBABase
*   ソースファイル名：JKKejbKK0171DBABase.java
*   作成者          ：富士通
*   日付            ：2011年04月21日
*＜機能概要＞
*   サービス契約内訳<eo光ネット>の制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/04/21  富士通      新規作成
*   v4.00.00    2013/05/07  FJ)竹内     IT1-2013-0001173
*
**********************************************************************/

package eo.ejb.common.db;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;

import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0171ETMsg;
import eo.ejb.cbm.entity.KK0171LE;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;

/**
 * <p>
 * サービス契約内訳<eo光ネット>の制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0171DBABase extends JPCejbDBABase
{

	/**
	 * <p>
	 * 新しいJKKejbKK0171DBABaseを作成します。
	 * </p>
	 */
	public JKKejbKK0171DBABase()
	{
		super(KK0171ETMsg.class.getName());
	}

	/**
	 * <p>
	 * 世代を管理するカラム名を取得します。
	 * </p>
	 * @return 世代を管理するカラム名
	 */
	protected String getGenerationColumn()
	{
		return KK0171ETMsg.GENE_ADD_DTM;
	}

	/**
	 * <p>
	 * 無効状態を管理するカラム名を取得します。
	 * </p>
	 * @return 無効状態を管理するカラム名
	 */
	protected String getInvalidColumn()
	{
		return KK0171ETMsg.MK_FLG;
	}

	/**
	 * <p>
	 * 予約管理エンティティか判定します。
	 * </p>
	 * @return 予約管理エンティティの場合はtrue
	 */
	protected boolean isReserveMgr()
	{
		return false;
	}

	/**
	 * <p>
	 * 予約適用基準日となるカラム名を取得します。
	 * </p>
	 * @return 予約適用基準日となるカラム名
	 */
	protected String getCurrentColumn()
	{
		return null;
	}

	/**
	 * <p>
	 * 予約の状態を管理するエンティティか判定します。
	 * </p>
	 * @return 予約の状態を管理するエンティティの場合はtrue
	 */
	protected boolean isReserveStateMgr()
	{
		return true;
	}

	/**
	 * <p>
	 * 予約の状態を管理するカラム名を取得します。
	 * </p>
	 * @return 予約の状態を管理するカラム名
	 */
	protected String getReserveStateColumn()
	{
		return KK0171ETMsg.RSV_APLY_CD;
	}

	/**
	 * <p>
	 * サービス契約内訳＜eo光ネット＞のプライマリレコードを取得を行います。
	 * </p>
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @param geneAddDtm 世代登録年月日時分秒
	 * @return サービス契約内訳番号、世代登録年月日時分秒に紐付くサービス契約内訳＜eo光ネット＞のプライマリレコード
	 */
	public CAANMsg getKK0171Primary(String svcKeiUcwkNo, String geneAddDtm)
	{
		CAANMsg searchKey = new CAANMsg(KK0171ETMsg.class.getName());
		searchKey.set(KK0171ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		searchKey.set(KK0171ETMsg.GENE_ADD_DTM, geneAddDtm);
		
		CAANMsg outMsg1 = new KK0171LE().findByPrimaryKey(searchKey);
		
		// 検索結果が未設定または無効フラグが"無効"の場合
		if (outMsg1 == null 
				|| JKKModelConst.MK_FLG_MK.equals(outMsg1.getString(KK0171ETMsg.MK_FLG)))
		{
			throw new CAANRuntimeException("該当のサービス契約内訳<eo光ネット>が存在しません。サービス契約内訳番号:" + svcKeiUcwkNo);
		}
		
		return outMsg1;
	}

	/**
	 * <p>
	 * サブタイプ用のカレントレコードの検索処理を行います。(予約適用年月日指定)
	 * </p>
	 * @param inMsg カレントレコードの検索キーが格納されたメッセージキャリア
	 * @param inCBMMsg 処理対象のメッセージキャリア
	 * @return 検索結果を格納したメッセージキャリア
	 */
	public CAANMsg findByCurrentReserve(CAANMsg msg, String geneAddDtm)
	{
		// メインタイプのカレントレコードを２世代取得
		CAANMsg msgMain = new CAANMsg(KK0161ETMsg.class.getName());
		msgMain.set(KK0161ETMsg.SVC_KEI_UCWK_NO, msg.getString(KK0171ETMsg.SVC_KEI_UCWK_NO));
		msgMain.set(KK0161ETMsg.GENE_ADD_DTM, geneAddDtm);

		CAANMsg retCaanMsg = new JKKejbKK0161DBABase().findByPrimaryKey(msgMain);

		// 検索結果が0件の場合
		if (retCaanMsg == null)
		{
			// 運用日付を設定する
			msgMain.set(KK0161ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(msg));
		}
		else
		{
			// 検索結果から予約適用年月日を取得する
			String rsvAplyYmd = retCaanMsg.getString(KK0161ETMsg.RSV_APLY_YMD);

			// 予約適用年月日が設定されていない場合
			if (rsvAplyYmd == null || rsvAplyYmd.trim().length() == 0)
			{
				// 運用日付を設定する
				msgMain.set(KK0161ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(msg));
			}
			else
			{
				// 予約適用年月日を設定する
				msgMain.set(KK0161ETMsg.RSV_APLY_YMD, rsvAplyYmd);
			}
		}
		
		return findByCurrentSub(msgMain);
	}
	

	/**
	 * <p>
	 * サブタイプ用のカレントレコードの検索処理を行います。
	 * </p>
	 * @param inMsg カレントレコードの検索キーが格納されたメッセージキャリア
	 * @return 検索結果を格納したメッセージキャリア
	 */
	public CAANMsg findByCurrent(CAANMsg msg)
	{
		// メインタイプのカレントレコードを２世代取得
		CAANMsg msgMain = new CAANMsg(KK0161ETMsg.class.getName());
		msgMain.set(KK0161ETMsg.SVC_KEI_UCWK_NO, msg.getString(KK0171ETMsg.SVC_KEI_UCWK_NO));
		msgMain.set(KK0161ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(msg));
		
		return findByCurrentSub(msgMain);
	}
		
	/**
	 * <p>
	 * サブタイプ用のカレントレコードの検索処理を行います。
	 * </p>
	 * @param inMsg カレントレコードの検索キーが格納されたメッセージキャリア
	 * @return 検索結果を格納したメッセージキャリア
	 */
	private CAANMsg findByCurrentSub(CAANMsg msg)
	{
		CAANMsg retMsgMain[] = new JKKejbKK0161DBABase().findByCurrentSecond(msg);

		// カレントレコードが存在しない場合、nullを返却する
		if (1 > retMsgMain.length)
		{
			return null;
		}

		// １世代目のレコードに紐付く、サブタイプのレコードを取得
		CAANMsg msgSub = new CAANMsg(KK0171ETMsg.class.getName());
		msgSub.set(KK0171ETMsg.SVC_KEI_UCWK_NO, retMsgMain[0].getString(KK0161ETMsg.SVC_KEI_UCWK_NO));
		msgSub.set(KK0171ETMsg.GENE_ADD_DTM, retMsgMain[0].getString(KK0161ETMsg.GENE_ADD_DTM));

		CAANMsg retMsgSub = super.findByPrimaryKey(msgSub);

		// １世代目のサブタイプのカレントレコードが存在しなかった場合
		if (null == retMsgSub)
		{
			// ２世代目のメインタイプカレントレコードが存在しない場合、nullを返却する
			if (2 > retMsgMain.length)
			{
				return null;
			}

			// ２世代目のレコードに紐付く、サブタイプのレコードを取得
			CAANMsg msgSub2 = new CAANMsg(KK0171ETMsg.class.getName());
			msgSub2.set(KK0171ETMsg.SVC_KEI_UCWK_NO, retMsgMain[1].getString(KK0161ETMsg.SVC_KEI_UCWK_NO));
			msgSub2.set(KK0171ETMsg.GENE_ADD_DTM, retMsgMain[1].getString(KK0161ETMsg.GENE_ADD_DTM));

			retMsgSub = super.findByPrimaryKey(msgSub2);
		}

		return retMsgSub;
	}
}
