/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0081C280KRCK
*	ソースファイル名：JEKK0081C280KRCK.java
*	作成者			：EK103142
*	日付			：2011年10月13日
*＜機能概要＞
*	関連チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.common.entity;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
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.KK0081ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0081C280CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0081DBABase;

/**
 * <p>
 * サービス契約休止予約取消の関連チェッククラスです。
 * ＜メソッド一覧＞
 * execKRCK
 * execEKK0081C280_KR1
 * execEKK0081C280_KR2
 * execEKK0081C280_KR4
 * </p>
 * @author 富士通
 */

public class JEKK0081C280KRCK
{	
	/**
	 * コンストラクタ
	 */
	public JEKK0081C280KRCK()
	{
	}

	/**
	 * サービス契約休止予約取消の関連チェックを行います。
	 * 
	 * @param inCBSMsg エンティティ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK0081C280KRCK.execKRCK");
		
		// inCBSMsgのチェック
		if(inCBSMsg == null)
		{
			throw new CAANRuntimeException("inCBSMsgがnullです。");
		}
		// ステータス
		int rtn = 0;
		
		rtn = execEKK0081C280_KR1(inCBSMsg, inContext, "EA");
		if(rtn <= StatusCodes.WARNING)
		{
			rtn = execEKK0081C280_KR2(inCBSMsg, inContext, "EA");
		}
		if(rtn <= StatusCodes.WARNING)
		{
			execEKK0081C280_KR4(inCBSMsg, inContext, "EB");
		}
		
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK0081C280KRCK.execKRCK");
	}
		
	/**
	 * EKK0081C280_制約ＮＯ1（関連）チェック
	 * 存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C280CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C280_KR1(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0081C280CBSMsg.SVC_KEI_NO))
		{
			// 検索条件の設定
			CAANMsg msg = new CAANMsg(KK0081ETMsg.class.getName());
			msg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C280CBSMsg.SVC_KEI_NO));
			msg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

			// 検索処理の実行
			CAANMsg ret = new JKKejbKK0081DBABase().findByCurrent(msg);
			if (ret == null)
			{
				// レコードが存在しない場合エラー
				inCBSMsg.set(EKK0081C280CBSMsg.SVC_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;
	}

	/**
	 * EKK0081C280_制約ＮＯ２（関連）チェック
	 * 存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C280CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C280_KR2(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		JKKejbKK0021KRCK kk0021krck = new JKKejbKK0021KRCK();
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0081C280CBSMsg.MSKM_DTL_NO))
		{
			// 判定条件
			if (!kk0021krck.isExistsNonGene(inCBSMsg.getString(EKK0081C280CBSMsg.MSKM_DTL_NO)))
			{
				// レコードが存在しない場合エラー
				inCBSMsg.set(EKK0081C280CBSMsg.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;
	}
	
	/**
	 * EKK0081C280_制約ＮＯ４（関連）チェック
	 * 存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C280CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C280_KR4(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0081C280CBSMsg.SVC_KEI_NO))
		{
			// コネクション
			Connection con1 = null;
			// プリペアステートメント
			PreparedStatement pstmt = null;
			// リザルトセット
			ResultSet rsltQuery = null;		
			
			try
			{
				//コネクション取得
				con1 = JSYejbConnection.getConnection(KK1681ETMsg.getTableName());
		
				// SQL文
				StringBuffer sql_Buff = new StringBuffer();
				sql_Buff.append("SELECT ")
						.append("    COUNT(*) CNT ")
						.append("FROM ")
						.append("    KK_T_IDO_RSV KK1681 ")
						.append("WHERE ")
						.append("    KK1681.SVC_KEI_NO = ? ")
						.append("    AND KK1681.MK_FLG = '0' ")
						.append("    AND KK1681.IDO_RSV_DTL_CD IN ('005', '006') ")
						.append("    AND KK1681.IDO_RSV_STAT_CD = '00' ");
		
				//prepareStatementにSQL文をセット
				pstmt = con1.prepareStatement(sql_Buff.toString());
		
				//ログ出力(SQL文の出力)
				JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
		
				// 文字列型パラメータの設定(エイリアスを指定)
				CAANJDBCUtil.setParam(pstmt, 1, inCBSMsg.getString(EKK0081C280CBSMsg.SVC_KEI_NO));
		
				// ResultSetの取得
				rsltQuery = pstmt.executeQuery();
			
				// 判定条件
				if(rsltQuery.next())
				{
					if(!(rsltQuery.getLong("CNT") > 0))
					{
						// レコードが存在しない場合エラー
						inCBSMsg.set(EKK0081C280CBSMsg.SVC_KEI_NO_ERR, errFlag);
						
						if("W".equals(errFlag.substring(0, 1)))
						{
							result = StatusCodes.WARNING;
						}
						else 
						{
							result = StatusCodes.RELATION_ERR;
						}
					}
				}
			}
			catch (SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
			finally
			{
				// 資源の解放
				try
				{
					if (rsltQuery != null)
					{
						rsltQuery.close();
					}
					if (pstmt != null)
					{
						pstmt.close();
					}
					if (con1 != null)
					{
						CAANConnectionMgr.getInstance().close(con1);
					}
				}
				catch (SQLException se)
				{
					throw new CAANRuntimeException(se);
				}
			}
		}
		
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		
		// レコードが存在する場合正常終了
		return result;
	}
}
