/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0161C111KRCK
*	ソースファイル名：JEKK0161C111KRCK.java
*	作成者			：EK103142
*	日付			：2012年06月29日
*＜機能概要＞
*	関連チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.common.entity;

import java.util.HashMap;

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.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0591ETMsg;
import eo.ejb.cbm.entity.KK0591LE;
import eo.ejb.cbm.entity.KK0791ETMsg;
import eo.ejb.cbm.entity.KK0791LE;
import eo.ejb.cbs.cbsmsg.EKK0161C111CBSMsg;
import eo.ejb.common.JCKModelCommon;
import eo.ejb.common.db.JKKejbKK0161DBABase;

/**
 * <p>
 * サービス契約内訳料金プラン変更(住所変更)の関連チェッククラスです。
 * ＜メソッド一覧＞
 * execKRCK
 * execEKK0161C111_KR1
 * execEKK0161C111_KR2
 * execEKK0161C111_KR3
 * execEKK0161C111_KR4
 * execEKK0161C111_KR5
 * execEKK0161C111_KR6
 * execEKK0161C111_KR7
 * execEKK0161C111_JS1
 * </p>
 * @author 富士通
 */

public class JEKK0161C111KRCK
{	
	/** 料金コース種別コード：サービス契約内訳 */
	private static final String SBT_SVC_KEI_UCWK = "2";
	
	/** サービス契約内訳ステータス：受付済 */
	private static final String UCWK_ST_FIN_RCPT = "010";
	
	/** サービス契約内訳ステータス：照査済 */
	private static final String UCWK_ST_FIN_CLT = "020";
	
	/** サービス契約内訳ステータス：締結済 */
	private static final String UCWK_ST_FIN_CCL = "030";
	
	/** サービス契約内訳ステータス：サービス提供中 */
	private static final String UCWK_ST_SVC_OFFER = "100";
	
	/** サービス契約内訳ステータス：休止・中断中 */
	private static final String UCWK_ST_PAUSE = "210";
	
	/** サービス契約内訳ステータス：停止中 */
	private static final String UCWK_ST_SVC_STOP = "220";
	
	/** サービス契約内訳ステータス：解約済 */
	private static final String UCWK_ST_KAIYAKU = "910";
	
	/** サービス契約内訳ステータス：キャンセル済 */
	private static final String UCWK_ST_CANCELL = "920";
	
	/**
	 * コンストラクタ
	 */
	public JEKK0161C111KRCK()
	{
	}

	/**
	 * サービス契約内訳料金プラン変更(住所変更)の関連チェックを行います。
	 * 
	 * @param inCBSMsg エンティティ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK0161C111KRCK.execKRCK");
		
		// inCBSMsgのチェック
		if(inCBSMsg == null)
		{
			throw new CAANRuntimeException("inCBSMsgがnullです。");
		}
		
		// ステータス
		int rtn = 0;
		
		rtn = execEKK0161C111_KR1(inCBSMsg, inContext, "EA");
		if(rtn <= StatusCodes.WARNING)
		{
			rtn = execEKK0161C111_KR2(inCBSMsg, inContext, "EA");
		}
		if(rtn <= StatusCodes.WARNING)
		{
			rtn = execEKK0161C111_KR3(inCBSMsg, inContext, "EA");
		}
		if(rtn <= StatusCodes.WARNING)
		{
			rtn = execEKK0161C111_KR4(inCBSMsg, inContext, "EB");
		}
		if(rtn <= StatusCodes.WARNING)
		{
			rtn = execEKK0161C111_KR5(inCBSMsg, inContext, "EC");
		}
		if(rtn <= StatusCodes.WARNING)
		{
			rtn = execEKK0161C111_KR6(inCBSMsg, inContext, "EA");
		}
		if(rtn <= StatusCodes.WARNING)
		{
			rtn = execEKK0161C111_KR7(inCBSMsg, inContext, "EB");
		}
		if(rtn <= StatusCodes.WARNING)
		{
			execEKK0161C111_JS1(inCBSMsg, inContext, "EA");
		}
		
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK0161C111KRCK.execKRCK");
	}
		
	/**
	 * EKK0161C111_制約ＮＯ1（関連）チェック
	 * サービス契約内訳存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0161C111CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0161C111_KR1(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0161C111CBSMsg.SVC_KEI_UCWK_NO))
		{
			// 検索条件の設定
			CAANMsg msg = new CAANMsg(KK0161ETMsg.class.getName());
			msg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, inCBSMsg.getString(EKK0161C111CBSMsg.SVC_KEI_UCWK_NO));
			
			// 予約適用年月日が未入力の場合
			if (inCBSMsg.isNull(EKK0161C111CBSMsg.RSV_APLY_YMD))
			{
				// 運用日付を設定する
				msg.set(KK0161ETMsg.RSV_APLY_YMD, JCKModelCommon.getOpeDate(inCBSMsg));
			}
			else
			{
				// 予約適用年月日を設定する
				msg.set(KK0161ETMsg.RSV_APLY_YMD, inCBSMsg.getString(EKK0161C111CBSMsg.RSV_APLY_YMD));
			}
			

			// 検索処理の実行
			CAANMsg ret = new JKKejbKK0161DBABase().findByCurrent(msg);
			if (ret == null)
			{
				// レコードが存在しない場合エラー
				inCBSMsg.set(EKK0161C111CBSMsg.SVC_KEI_UCWK_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;
	}
	
	/**
	 * EKK0161C111_制約ＮＯ２（関連）チェック
	 * 存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0161C111CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0161C111_KR2(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		JKKejbKK0021KRCK kk0021krck = new JKKejbKK0021KRCK();
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0161C111CBSMsg.MSKM_DTL_NO))
		{
			// 判定条件
			if (!kk0021krck.isExistsNonGene(inCBSMsg.getString(EKK0161C111CBSMsg.MSKM_DTL_NO)))
			{
				// レコードが存在しない場合エラー
				inCBSMsg.set(EKK0161C111CBSMsg.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;
	}
	
	/**
	 * EKK0161C111_制約ＮＯ３（関連）チェック
	 * 存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0161C111CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0161C111_KR3(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		JKKejbKK0791KRCK kk0791krck = new JKKejbKK0791KRCK();
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0161C111CBSMsg.PCRS_CD))
		{
			// 判定条件
			if (!kk0791krck.isExistsNonGene(inCBSMsg.getString(EKK0161C111CBSMsg.PCRS_CD)))
			{
				// レコードが存在しない場合エラー
				inCBSMsg.set(EKK0161C111CBSMsg.PCRS_CD_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;
	}
	
	/**
	 * EKK0161C111_制約ＮＯ４（関連）チェック
	 * 存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0161C111CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0161C111_KR4(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0161C111CBSMsg.PCRS_CD))
		{
			CAANMsg kk0791Msg = new CAANMsg(KK0791ETMsg.class.getName());
			KK0791LE kk0791 = new KK0791LE();

			// サービス契約番号に紐付く異動予約番号を取得するためにメッセージを生成
			kk0791Msg.set(KK0791ETMsg.PCRS_CD, inCBSMsg.getString(EKK0161C111CBSMsg.PCRS_CD));
			kk0791Msg.set(KK0791ETMsg.PCRS_SBT_CD, SBT_SVC_KEI_UCWK);
			kk0791Msg.set(KK0791ETMsg.MK_FLG, "0");

			// 料金コースを条件付き検索
			CAANMsg[] rtnMsg;
			try
			{
				rtnMsg = kk0791.findByCondition(kk0791Msg);
			}
			catch (CAANException e)
			{
				throw new CAANRuntimeException(e);
			}
			
			// 判定条件
			if (rtnMsg == null || rtnMsg.length < 1)
			{
				// レコードが存在しない場合エラー
				inCBSMsg.set(EKK0161C111CBSMsg.PCRS_CD_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;
	}
	
	/**
	 * EKK0161C111_制約ＮＯ５（関連）チェック
	 * 存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0161C111CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0161C111_KR5(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0161C111CBSMsg.PCRS_CD) && !inCBSMsg.isNull(EKK0161C111CBSMsg.PPLAN_CD))
		{
			CAANMsg kk0591Msg = new CAANMsg(KK0591ETMsg.class.getName());
			KK0591LE kk0591 = new KK0591LE();

			// サービス契約番号に紐付く異動予約番号を取得するためにメッセージを生成
			kk0591Msg.set(KK0591ETMsg.PCRS_CD, inCBSMsg.getString(EKK0161C111CBSMsg.PCRS_CD));
			kk0591Msg.set(KK0591ETMsg.PPLAN_CD, inCBSMsg.getString(EKK0161C111CBSMsg.PPLAN_CD));
			kk0591Msg.set(KK0591ETMsg.MK_FLG, "0");

			// 料金コースを条件付き検索
			CAANMsg[] rtnMsg;
			try
			{
				rtnMsg = kk0591.findByCondition(kk0591Msg);
			}
			catch (CAANException e)
			{
				throw new CAANRuntimeException(e);
			}
			
			// 判定条件
			if (rtnMsg == null || rtnMsg.length < 1)
			{
				// レコードが存在しない場合エラー
				inCBSMsg.set(EKK0161C111CBSMsg.PCRS_CD_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;
	}
	
	/**
	 * EKK0161C111_制約ＮＯ６（関連）チェック
	 * 存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0161C111CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0161C111_KR6(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		JKKejbKK0891KRCK kk0891krck = new JKKejbKK0891KRCK();
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0161C111CBSMsg.TK_HOSHIKI_KEI_NO))
		{
			// 判定条件
			if (!kk0891krck.isExistsYuko(inCBSMsg.getString(EKK0161C111CBSMsg.TK_HOSHIKI_KEI_NO)))
			{
				// レコードが存在しない場合エラー
				inCBSMsg.set(EKK0161C111CBSMsg.TK_HOSHIKI_KEI_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;
	}
	
	/**
	 * EKK0161C111_制約ＮＯ７（関連）チェック
	 * 一致チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0161C111CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0161C111_KR7(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0161C111CBSMsg.PCRS_CD) && 
			 !inCBSMsg.isNull(EKK0161C111CBSMsg.PPLAN_CD) && 
			 !inCBSMsg.isNull(EKK0161C111CBSMsg.TK_HOSHIKI_KEI_NO))
		{
			// サービス契約内訳からカレントレコードを取得
			CAANMsg kk0161Msg = new CAANMsg(KK0161ETMsg.class.getName());
			kk0161Msg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, inCBSMsg.getString(EKK0161C111CBSMsg.SVC_KEI_UCWK_NO));

			// 予約適用年月日が未入力の場合
			if (inCBSMsg.isNull(EKK0161C111CBSMsg.RSV_APLY_YMD))
			{
				// 運用日付を設定する
				kk0161Msg.set(KK0161ETMsg.RSV_APLY_YMD, JCKModelCommon.getOpeDate(inCBSMsg));
			}
			else
			{
				// 予約適用年月日を設定する
				kk0161Msg.set(KK0161ETMsg.RSV_APLY_YMD, inCBSMsg.getString(EKK0161C111CBSMsg.RSV_APLY_YMD));
			}

			// サービス契約内訳をカレント検索
			 CAANMsg rtnMsg = new JKKejbKK0161DBABase().findByCurrent(kk0161Msg);
			
			// 取得結果が0件の場合
			if (rtnMsg == null)
			{
				// レコードが存在しない場合エラー
				inCBSMsg.set(EKK0161C111CBSMsg.TK_HOSHIKI_KEI_NO_ERR, errFlag);

				if ("W".equals(errFlag.substring(0, 1)))
				{
					result = StatusCodes.WARNING;
				}
				else
				{
					result = StatusCodes.RELATION_ERR;
				}
			}

			// 料金コース、料金プラン、提供方式契約番号を取得（入力値とＤＢ取得値）
			String inputPcrsCd = inCBSMsg.getString(EKK0161C111CBSMsg.PCRS_CD);
			String inputPplanCd = inCBSMsg.getString(EKK0161C111CBSMsg.PPLAN_CD);
			String inputTkHoshikiKeiNo = inCBSMsg.getString(EKK0161C111CBSMsg.TK_HOSHIKI_KEI_NO);
			
			String dbPcrsCd = rtnMsg.getString(KK0161ETMsg.PCRS_CD);
			String dbPplanCd = rtnMsg.getString(KK0161ETMsg.PPLAN_CD);
			String dbTkHoshikiKeiNo = rtnMsg.getString(KK0161ETMsg.TK_HOSHIKI_KEI_NO);

			if (inputPcrsCd.equals(dbPcrsCd) && 
				inputPplanCd.equals(dbPplanCd) && 
				inputTkHoshikiKeiNo.equals(dbTkHoshikiKeiNo))
			{
				// すべて一致した場合エラー
				inCBSMsg.set(EKK0161C111CBSMsg.TK_HOSHIKI_KEI_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;
	}
	
	/**
	 * EKK0161C111_制約ＮＯ１（状態）チェック
	 * 状態チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0161C111CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0161C111_JS1(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0161C111CBSMsg.SVC_KEI_UCWK_NO))
		{
			// 検索条件の設定
			CAANMsg msg = new CAANMsg(KK0161ETMsg.class.getName());
			msg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, inCBSMsg.getString(EKK0161C111CBSMsg.SVC_KEI_UCWK_NO));
			
			// 予約適用年月日が未入力の場合
			if (inCBSMsg.isNull(EKK0161C111CBSMsg.RSV_APLY_YMD))
			{
				// 運用日付を設定する
				msg.set(KK0161ETMsg.RSV_APLY_YMD, JCKModelCommon.getOpeDate(inCBSMsg));
			}
			else
			{
				// 予約適用年月日を設定する
				msg.set(KK0161ETMsg.RSV_APLY_YMD, inCBSMsg.getString(EKK0161C111CBSMsg.RSV_APLY_YMD));
			}

			// 検索処理の実行
			CAANMsg ret = new JKKejbKK0161DBABase().findByCurrent(msg);
			if (ret != null)
			{
				// オプションサービス契約ステータス取得
				String svc_ucwk_st = ret.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT);
				
				HashMap<String, String> chkMap = new HashMap<String, String>();
				chkMap.put(UCWK_ST_FIN_RCPT, "");
				chkMap.put(UCWK_ST_FIN_CLT, "");
				chkMap.put(UCWK_ST_FIN_CCL, "");
				chkMap.put(UCWK_ST_SVC_OFFER, "");
				chkMap.put(UCWK_ST_SVC_STOP, "");
				chkMap.put(UCWK_ST_PAUSE, "");
				chkMap.put(UCWK_ST_KAIYAKU, "");
				chkMap.put(UCWK_ST_CANCELL, "");
				
				if (svc_ucwk_st == null || !chkMap.containsKey(svc_ucwk_st))
				{
					//ステータスが指定の値以外の場合エラー
					inCBSMsg.set(EKK0161C111CBSMsg.SVC_KEI_UCWK_NO_ERR, errFlag);
					
					if("W".equals(errFlag.substring(0, 1)))
					{
						result = StatusCodes.WARNING;
					}
					else 
					{
						result = StatusCodes.STATUSTRANS_ERR;
					}
				}
			}
		}
		
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		
		// レコードが存在する場合正常終了
		return result;
	}
}
