/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0081C120KRCK
*   ソースファイル名：JEKK0081C120KRCK.java
*   作成者          ：富士通
*   日付            ：2011年10月13日
*＜機能概要＞
*   サービス契約料金プラン変更確定の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/10/13  富士通      新規作成
*   v6.00.00    2013/12/16  FJ)大山     OM-2013-0004533
*   v9.00.00    2014/07/02  FJ)中野     OM-2014-0002006
*
**********************************************************************/

package eo.ejb.common.entity;

import com.fujitsu.futurity.common.JCMConstants;
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.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK0081C120CBSMsg;

/**
 * <p>
 * サービス契約料金プラン変更確定の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0081C120KRCK
{

	/** 異動予約詳細コード：コース変更 */
	private static final String IDO_RSV_CD_SVC_KAIYAKU = "003";
	
	/** 異動予約状態コード：予約手続中 */
	private static final String IDO_RSV_STAT_CD_RSV_TETUDUKI = "03"; 
	
	/** 異動区分：光電話・番号解約*/
	private static final String IDO_DIV_EOH_TEL_NUM_DSL = "00043"; 
	
	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 存在チェック) */
	private static final String[] KRCK_SVCKEI_EXISTS_ERR = {"EA", EKK0081C120CBSMsg.SVC_KEI_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(異動予約 存在チェック) */
	private static final String[] KRCK_IDO_EXISTS_ERR = {"EB", EKK0081C120CBSMsg.SVC_KEI_NO_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(異動予約 存在チェック) */
	private static final String[] KRCK_SVC_DSL_CHK_ERR = {"ED", EKK0081C120CBSMsg.SVC_KEI_NO_ERR};

	// OM-2014-0002006 ADD START
	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約内訳 存在チェック) */
	private static final String[] KRCK_SVC_KEI_UCWK_EXISTS_ERR = {"EA", EKK0081C120CBSMsg.SVC_KEI_UCWK_NO_ERR};
	// OM-2014-0002006 ADD END 
	/**
	 * <p>
	 * 新しいJEKK0081C100KRCKを作成します。
	 * </p>
	 */
	public JEKK0081C120KRCK()
	{
	}

	/**
	 * <p>
	 * サービス契約料金プラン変更確定の関連制約を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// サービス契約関連チェック部品
		JKKejbKK0081KRCK kk0081KRCK = new JKKejbKK0081KRCK();

		// サービス契約番号
		String svcKeiNo = inCBSMsg.getString(EKK0081C120CBSMsg.SVC_KEI_NO);
		
		// サービス契約 存在チェック
		if (!kk0081KRCK.isExistsCurrent(inCBSMsg, svcKeiNo))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_EXISTS_ERR);
			return;
		}

		// 異動予約_存在チェック
		if(svcKeiNo != null)
		{

			if(!isExistsIdo(svcKeiNo, IDO_RSV_CD_SVC_KAIYAKU, IDO_RSV_STAT_CD_RSV_TETUDUKI))
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_IDO_EXISTS_ERR);
				return;			

			}
		}
		
		
		// サービス解約起算日設定チェック
		if(!inCBSMsg.isNull(EKK0081C120CBSMsg.SVC_DSL_KISAN_YMD)) {
			if(!isExistsIdoDiv(svcKeiNo, IDO_DIV_EOH_TEL_NUM_DSL, IDO_RSV_STAT_CD_RSV_TETUDUKI)) {
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVC_DSL_CHK_ERR);
				return;			
			}
		}
		
		// OM-2014-0002006 ADD START
		// サービス契約内訳関連チェック部品
		JKKejbKK0161KRCK kk0161KRCK = new JKKejbKK0161KRCK();
		
		// サービス契約内訳 存在チェック
		if (!kk0161KRCK.isExistsCurrent(inCBSMsg,inCBSMsg.getString(EKK0081C120CBSMsg.SVC_KEI_UCWK_NO)))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVC_KEI_UCWK_EXISTS_ERR);
			return;
		}
		// OM-2014-0002006 ADD END
	}
	
	/**
	 * <p>
	 * エラー返却項目にエラーフラグを設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param status エラー時のステータス
	 * @param errInfo[] エラー情報が設定された配列 [0]:エラーフラグ [1]:エラー返却項目
	 */
	private void setErrInfo(CAANMsg inCBSMsg, int status, String[] errInfo)
	{
		inCBSMsg.set(JCMConstants.STATUS_INT_KEY, status);
		inCBSMsg.set(errInfo[1], errInfo[0]);
		return;
		
	}

	/**
	 * <p>
	 * 異動予約_存在チェックを判定します。
	 * </p>
	 * @param  svc_kei_no サービス契約番号
	 * @param  ido_rsv_dtl_cd 異動予約詳細コード
	 * @param  ido_rsv_stat_cd 異動予約状態コード
	 * @return judgeFlg チェック結果
	 */
	private boolean isExistsIdo(String svc_kei_no, String ido_rsv_dtl_cd, String ido_rsv_stat_cd)
	{
		// 判定フラグ
		boolean judgeFlg = false;

		try
		{
			// 異動予約メッセージインスタンスを生成
			CAANMsg idoMsg = new CAANMsg(KK1681ETMsg.class.getName());

			// サービス契約番号に紐付く異動予約番号を取得するためにメッセージを生成
			idoMsg.set(KK1681ETMsg.SVC_KEI_NO, svc_kei_no);
			idoMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, ido_rsv_dtl_cd);
			idoMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, ido_rsv_stat_cd);
			idoMsg.set(KK1681ETMsg.MK_FLG, "0");

			// KK1681LEインスタンスの生成
			KK1681LE idoLe = new KK1681LE();

			// CAANMsg配列を生成
			CAANMsg[] resIdoMsg = new CAANMsg[]{};

			// ロジカルエンティティを生成し、異動予約を検索
			resIdoMsg = idoLe.findByCondition(idoMsg);

			if(resIdoMsg.length > 0)
			{

				//レコードが存在する場合
				judgeFlg = true;
			}

		}
		catch(CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		return judgeFlg;
	}

	/**
	 * <p>
	 * 異動予約存在チェック（異動区分）を実行する
	 * </p>
	 * @param  svc_kei_no サービス契約番号
	 * @param  ido_rsv_dtl_cd 異動予約詳細コード
	 * @param  ido_rsv_stat_cd 異動予約状態コード
	 * @return judgeFlg チェック結果
	 */
	private boolean isExistsIdoDiv(String svc_kei_no, String ido_rsv_div, String ido_rsv_stat_cd)
	{
		// 判定フラグ
		boolean judgeFlg = false;

		try
		{
			// 異動予約メッセージインスタンスを生成
			CAANMsg idoMsg = new CAANMsg(KK1681ETMsg.class.getName());

			// サービス契約番号に紐付く異動予約番号を取得するためにメッセージを生成
			idoMsg.set(KK1681ETMsg.SVC_KEI_NO, svc_kei_no);
			idoMsg.set(KK1681ETMsg.IDO_DIV, ido_rsv_div);
			idoMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, ido_rsv_stat_cd);
			idoMsg.set(KK1681ETMsg.MK_FLG, "0");

			// KK1681LEインスタンスの生成
			KK1681LE idoLe = new KK1681LE();

			// CAANMsg配列を生成
			CAANMsg[] resIdoMsg = new CAANMsg[]{};

			// ロジカルエンティティを生成し、異動予約を検索
			resIdoMsg = idoLe.findByCondition(idoMsg);

			if(resIdoMsg.length > 0)
			{

				//レコードが存在する場合
				judgeFlg = true;
			}

		}
		catch(CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		return judgeFlg;
	}
}

