/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0081C190KRCK
*	ソースファイル名：JEKK0081C190KRCK.java
*	作成者			：EK103142
*	日付			：2011年10月09日
*＜機能概要＞
*	関連チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*   v5.00.00    2013/08/18  FJ)寺本     OT-2013-0000716
*   v5.00.01    2013/10/15  FJ)寺園     OM-2013-0003064
*   v5.00.02    2013/10/29  FJ)沖田     OM-2013-0003804
********************************************************************************/

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.EKK0081C190CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0081DBABase;

/**
 * <p>
 * サービス契約解約中止の関連チェッククラスです。
 * ＜メソッド一覧＞
 * execKRCK
 * execEKK0081C190_KR1
 * execEKK0081C190_KR2
 * </p>
 * @author 富士通
 */

public class JEKK0081C190KRCK
{	
	/**
	 * コンストラクタ
	 */
	public JEKK0081C190KRCK()
	{
	}

	/**
	 * サービス契約解約中止の関連チェックを行います。
	 * 
	 * @param inCBSMsg エンティティ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */

	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK0081C190KRCK.execKRCK");
		
		// inCBSMsgのチェック
		if(inCBSMsg == null)
		{
			throw new CAANRuntimeException("inCBSMsgがnullです。");
		}
		// ステータス
		int rtn = 0;
		
		rtn = execEKK0081C190_KR1(inCBSMsg, inContext, "EA");
		
		if (rtn <= 4)
		{
			if (isCheckExecTelTdkFk(inCBSMsg, inContext))
			{
				rtn = execEKK0081C190_KR2(inCBSMsg, inContext, "EB");
			}
		}
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK0081C190KRCK.execKRCK");
	}
		
	/**
	 * EKK0081C190_制約ＮＯ1（関連）チェック
	 * 未存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C190CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C190_KR1(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0081C190CBSMsg.SVC_KEI_NO))
		{
			// コネクション
			Connection con1 = null;
			// プリペアステートメント
			PreparedStatement pstmt = null;
			// リザルトセット
			ResultSet rsltQuery = null;		
			
			try
			{
				// 運用日付取得
				String upd_date = JKKModelCommon.getOpeDate(inCBSMsg);
								
				//コネクション取得
				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.IDO_RSV_DTL_CD = '007' ")
						.append("    AND KK1681.IDO_RSV_STAT_CD IN ('03', '00') ")
						.append("    AND KK1681.MK_FLG = '0' ")
						.append("    AND KK1681.RSV_APLY_YMD >= ? ");
		
				//prepareStatementにSQL文をセット
				pstmt = con1.prepareStatement(sql_Buff.toString());
		
				//ログ出力(SQL文の出力)
				JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
		
				// 文字列型パラメータの設定(エイリアスを指定)
				CAANJDBCUtil.setParam(pstmt, 1, inCBSMsg.getString(EKK0081C190CBSMsg.SVC_KEI_NO));
				CAANJDBCUtil.setParam(pstmt, 2, upd_date);
		
				// ResultSetの取得
				rsltQuery = pstmt.executeQuery();
			
				// 判定条件
				if(rsltQuery.next())
				{
					if(!(rsltQuery.getLong("CNT") > 0))
					{
						// レコードが存在しない場合エラー
						inCBSMsg.set(EKK0081C190CBSMsg.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;
	}
	
	/**
	 * EKK0081C190_制約ＮＯ2（関連）チェック
	 * 未存在ネット・電話解約予約チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C190CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C190_KR2(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		if (!inCBSMsg.isNull(EKK0081C190CBSMsg.SVC_KEI_NO))
		{
			// サービス契約のカレントレコード検索
			CAANMsg inMsgKK0081 = new CAANMsg(KK0081ETMsg.class.getName());
			inMsgKK0081.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C190CBSMsg.SVC_KEI_NO));
			inMsgKK0081.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

			CAANMsg retMsgKK0081 = new JKKejbKK0081DBABase().findByCurrent(inMsgKK0081);

			// カレントレコードが存在しなかった場合はfalseを返却
			if (null == retMsgKK0081)
			{
				// レコードが存在しない場合エラー
				inCBSMsg.set(EKK0081C190CBSMsg.SVC_KEI_NO_ERR, errFlag);
				
				if("W".equals(errFlag.substring(0, 1)))
				{
					result = StatusCodes.WARNING;
				}
				else 
				{
					result = StatusCodes.RELATION_ERR;
				}
			}

			if (JKKModelConst.SVC_CD_TEL.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_CD)))
			{
				if (!JKKModelCommon.netTelDslRsvChkKK0081(inCBSMsg, inContext, retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_NO)))
				{
					// レコードが存在しない場合エラー
					inCBSMsg.set(EKK0081C190CBSMsg.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;
	}
	

	/**
	 * 入力．異動区分を元に、未存在ネット・電話解約予約チェック対象かどうかを判定する。
	 * 入力．異動区分が「撤去(解約)」「工事情報訂正」「登録内容修正」の場合、
	 * 関連制約「未存在ネット・電話解約予約チェック」を行わない。
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C190CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @return checkExecFlg 妥当性チェック実行フラグ true：妥当性チェックを行う、false：妥当性チェックを行わない
	 */
	private boolean isCheckExecTelTdkFk(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		if (JKKModelConst.IDO_DIV_TEKKYO_DSL.equals(inCBSMsg.getString(EKK0081C190CBSMsg.IDO_DIV))
			|| JKKModelConst.IDO_DIV_ADD_NAIYO_SHUSEI.equals(inCBSMsg.getString(EKK0081C190CBSMsg.IDO_DIV))
			|| JKKModelConst.IDO_DIV_KJJH_TEISE.equals(inCBSMsg.getString(EKK0081C190CBSMsg.IDO_DIV)))
		{
			return false;
		}
		return true;
	}
}
