/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0081C070KRCK
*   ソースファイル名：JEKK0081C070KRCK.java
*   作成者          ：富士通
*   日付            ：2011年10月13日
*＜機能概要＞
*   サービス契約休止受付の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/10/13  富士通      新規作成
*  v10.00.00    2014/10/22  齋藤       【OM-2014-0003297】解約中に休止解除日を過ぎると休止解除できない
**********************************************************************/

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.KK0081ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK0081C080CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * サービス契約休止変更の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0081C080KRCK
{
	/** 異動予約詳細コード：サービス休止 */
	private static final String IDO_RSV_CD_SVC_005 = "005";
	
	/** 異動予約詳細コード：サービス休止解除 */
	private static final String IDO_RSV_CD_SVC_006 = "006";
	
	/** 異動予約状態コード：未反映 */
	private static final String IDO_RSV_STAT_CD_RSV_00 = "00"; 
	
	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 存在チェック) */
	private static final String[] KRCK_SVCKEI_EXISTS_ERR = {"EA", EKK0081C080CBSMsg.SVC_KEI_NO_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(申込明細 存在チェック) */
	private static final String[] KRCK_MSKMDTL_EXISTS_ERR = {"EA", EKK0081C080CBSMsg.MSKM_DTL_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 休止年月日変更チェック) */
	private static final String[] KRCK_SVC_PAUSE_YMD_ERR = {"EA", EKK0081C080CBSMsg.SVC_PAUSE_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約&異動予約 休止予約存在チェック) */
	private static final String[] KRCK_SVC_PAUSE_YYK_EXISTS_ERR = {"EB", EKK0081C080CBSMsg.SVC_PAUSE_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(異動予約 休止解除予約存在チェック) */
	private static final String[] KRCK_SVC_PAUSE_RLS_EXISTS_ERR = {"EA", EKK0081C080CBSMsg.SVC_PAUSE_RLS_YMD_ERR};
	
	/** 状態遷移チェックエラーフラグ&エラー返却項目(サービス契約 状態チェック) */
	private static final String[] JSCK_STATUS_ERR = {"EA", EKK0081C080CBSMsg.SVC_KEI_NO_ERR};
	
	/**
	 * <p>
	 * 新しいJEKK0081C100KRCKを作成します。
	 * </p>
	 */
	public JEKK0081C080KRCK()
	{
	}

	/**
	 * <p>
	 * サービス契約休止変更の関連制約を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// サービス契約関連チェック部品
		JKKejbKK0081KRCK kk0081KRCK = new JKKejbKK0081KRCK();

		// サービス契約番号
		String svcKeiNo = inCBSMsg.getString(EKK0081C080CBSMsg.SVC_KEI_NO);
		
		// サービス契約 存在チェック
		if (!kk0081KRCK.isExistsCurrent(inCBSMsg, svcKeiNo))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_EXISTS_ERR);
			return;
		}

		// 申込明細関連チェック部品
		JKKejbKK0021KRCK kk0021KRCK = new JKKejbKK0021KRCK();

		// 申込番号
		String mskmDtlNo = inCBSMsg.getString(EKK0081C080CBSMsg.MSKM_DTL_NO);

		// 申込明細 存在チェック
		if (!kk0021KRCK.isExistsNonGene(mskmDtlNo))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_MSKMDTL_EXISTS_ERR);
			return;
		}

		// 休止年月日変更チェック
		String svc_pause_ymd = inCBSMsg.getString(EKK0081C080CBSMsg.SVC_PAUSE_YMD);
		
		if(svcKeiNo != null && svc_pause_ymd != null)
		{
			// 変更チェック
			CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
			inETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C080CBSMsg.SVC_KEI_NO));
			inETMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
			CAANMsg currentKK0081 = kk0081KRCK.findByCurrent(inETMsg);

			// サービス休止年月日のチェック
			if("210".equals(currentKK0081.getString(KK0081ETMsg.SVC_KEI_STAT)))
			{
				
				//サービス契約カレントレコードのステータスが"休止・中断中"で、サービス休止年月日が変更されている場合、エラー
				if(!svc_pause_ymd.equals(currentKK0081.getString(KK0081ETMsg.SVC_PAUSE_YMD)))
				{
					setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVC_PAUSE_YMD_ERR);
					return;
					
				}
				
			}
			
			if("100".equals(currentKK0081.getString(KK0081ETMsg.SVC_KEI_STAT)))
			{
				// サービス契約&異動予約_休止予約存在チェック
				// 異動予約レコードの存在チェック
				
				if(!isExistsIdo(inCBSMsg, inContext, IDO_RSV_CD_SVC_005, IDO_RSV_STAT_CD_RSV_00))
				{
					setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVC_PAUSE_YYK_EXISTS_ERR);
					return;			

				}
				
			}

		}
//2014/10/22 OM-2014-0003297 DEL START
//		// 異動予約_休止解除予約存在チェック
//		String svc_pause_rls_ymd = inCBSMsg.getString(EKK0081C080CBSMsg.SVC_PAUSE_RLS_YMD);
//		
//		if(svcKeiNo != null && svc_pause_rls_ymd != null)
//		{
//
//			if(!isExistsIdo(inCBSMsg, inContext, IDO_RSV_CD_SVC_006, IDO_RSV_STAT_CD_RSV_00))
//			{
//				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVC_PAUSE_RLS_EXISTS_ERR);
//				return;			
//
//			}
//		}
//2014/10/22 OM-2014-0003297 DEL END
		
		// サービス契約状態遷移チェック用ETメッセージ
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(JCMConstants.TEMPLATE_ID_KEY, inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY));
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C080CBSMsg.SVC_KEI_NO));
		
		// サービス契約 状態チェック
		if (!JKKModelCommon.checkStateTransitionKK0081(inETMsg, inContext))
		{
			setErrInfo(inCBSMsg, StatusCodes.STATUSTRANS_ERR, JSCK_STATUS_ERR);
			return;			
		}
	}
	
	/**
	 * <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  inCBSMsg チェック対象のCBSMsg(EKK0081C080CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  ido_rsv_dtl_cd 異動予約詳細コード
	 * @param  ido_rsv_stat_cd 異動予約状態コード
	 * @return judgeFlg チェック結果
	 */
	private boolean isExistsIdo(CAANMsg inCBSMsg, AgentDispatchContext inContext, 
			String ido_rsv_dtl_cd, String ido_rsv_stat_cd)
	{
		// 判定フラグ
		boolean judgeFlg = false;
		
		if (!inCBSMsg.isNull(EKK0081C080CBSMsg.SVC_KEI_NO))
		{
			try
			{
				// 異動予約メッセージインスタンスを生成
				CAANMsg idoMsg = new CAANMsg(KK1681ETMsg.class.getName());
	
				// サービス契約番号に紐付く異動予約番号を取得するためにメッセージを生成
				idoMsg.set(KK1681ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C080CBSMsg.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;
	}

}

