/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK2811C170KRCK
*	ソースファイル名：JEKK2811C170KRCK.java
*	作成者			：富士通
*	日付			：2013年11月14日
*＜機能概要＞
*	関連チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v7.00.00	2013/11/14	富士通		新規作成
*
********************************************************************************/

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.JSYejbLog;
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.EKK2811C170CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 機器オプションサービス契約解約中止関連チェッククラスです。
 * ＜メソッド一覧＞
 * execKRCK
 * execEKK0341C360_KR2
 * execEKK0341C360_KR3 
 * </p>
 * @author 富士通
 */

public class JEKK2811C170KRCK
{
	
	/** 異動予約詳細コード（機器オプション解約） */
	static final String IDO_RSV_DTL_CD_KKOP_DSL = "024";
	
	/** 異動予約状態コード：未反映 */
	static final String IDO_RSV_STAT_CD_MIHANEI = "00"; 
	
	/** 異動予約状態コード：予約手続中 */
	static final String IDO_RSV_STAT_CD_RSV_TETUDUKI = "03"; 

	/**
	 * コンストラクタ
	 */

	public JEKK2811C170KRCK()
	{
	}

	/**
	 * 機器提供サービス契約解約中止関連チェックを行います。
	 * 
	 * @param inCBSMsg エンティティ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */

	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK2811C170KRCK.execKRCK");

		// ステータス
		int rtn = 0;
		
		rtn = execEKK2811C170_KR1(inCBSMsg, inContext, "EA");
		if(rtn <= StatusCodes.WARNING)
		{
			rtn = execEKK2811C170_KR2(inCBSMsg, inContext, "EA");
		}

		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK2811C170KRCK.execKRCK");
	}
		
	/**
	 * EKK2811C170_制約No1（関連）チェック
	 * 存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(KK2811CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK2811C170_KR1(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// 判定フラグ
		boolean judgeFlg = false;
		
		if (!inCBSMsg.isNull(EKK2811C170CBSMsg.KKOP_SVC_KEI_NO))
		{
			try
			{
				// 異動予約メッセージインスタンスを生成
				CAANMsg idoMsg = new CAANMsg(KK1681ETMsg.class.getName());
	
				// 機器オプションサービス契約番号に紐付く異動予約番号を取得するためにメッセージを生成
				idoMsg.set(KK1681ETMsg.KKOP_SVC_KEI_NO, inCBSMsg.getString(EKK2811C170CBSMsg.KKOP_SVC_KEI_NO));
				idoMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDO_RSV_DTL_CD_KKOP_DSL);
				idoMsg.set(KK1681ETMsg.MK_FLG, "0");
	
				// KK1681LEインスタンスの生成
				KK1681LE idoLe = new KK1681LE();
	
				// CAANMsg配列を生成
				CAANMsg[] resIdoMsg = new CAANMsg[]{};
	
				// ロジカルエンティティを生成し、異動予約を検索
				resIdoMsg = idoLe.findByCondition(idoMsg);
				
				for(CAANMsg msg : resIdoMsg)
				{
					if(IDO_RSV_STAT_CD_RSV_TETUDUKI.equals(msg.getString(KK1681ETMsg.IDO_RSV_STAT_CD)) ||
						((IDO_RSV_STAT_CD_MIHANEI.equals(msg.getString(KK1681ETMsg.IDO_RSV_STAT_CD)) &&
						(JKKModelCommon.getOpeDate(inCBSMsg).compareTo(msg.getString(KK1681ETMsg.RSV_APLY_YMD))) <= 0)))
					{
						// 機器提供サービス契約番号に紐付く「異動予約詳細コード」が"機器オプション解約"
						//「異動予約状態コード」が"予約手続中"または"未反映"で予約適用年月日が運用日付より
						// 未来日のレコードが存在する場合
						
						judgeFlg = true;
					}
				}
				if (!judgeFlg)
				{
					// レコードが存在しない場合
					inCBSMsg.set(EKK2811C170CBSMsg.KKOP_SVC_KEI_NO_ERR, errFlag);
						
					if("W".equals(errFlag.substring(0, 1)))
					{
						result = StatusCodes.WARNING;
					}
					else 
					{
						result = StatusCodes.RELATION_ERR;
					}
				}
			}
			catch(CAANException ce)
			{
				throw new CAANRuntimeException(ce);
			}
		}
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		// 解約済のレコードが存在しない場合
		return result;
	}

	/**
	 * EKK2811C170_制約No2（関連）チェック
	 *
	 * @param  inCBSMsg  チェック対象のCBSMsg(KK2811CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag   ERRフラグ
	 * @return result    チェック結果
	 */
	private int execEKK2811C170_KR2(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// ステータス
		int result = 0;

		JKKejbKK0021KRCK kk0021krck = new JKKejbKK0021KRCK();

		// チェック条件
		if (!inCBSMsg.isNull(EKK2811C170CBSMsg.MSKM_DTL_NO))
		{
			// 判定条件
			if(!kk0021krck.isExistsNonGene(inCBSMsg.getString(EKK2811C170CBSMsg.MSKM_DTL_NO)))
			{
				inCBSMsg.set(EKK2811C170CBSMsg.MSKM_DTL_NO_ERR, errFlag);
				if("W".equals(errFlag.substring(0, 1)))
				{
					result = StatusCodes.WARNING;
				}
				else
				{
					result = StatusCodes.RELATION_ERR;
				}
			}
		}
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		return result;
	}
	
}

