/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK2451KRCK
*	ソースファイル名：JKKejbKK2451KRCK.java
*	作成者			：富士通
*	日付			：2012年8月14日
*＜機能概要＞
*	他事業者割引契約対象契約制約部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/08/14	FJ)			新規作成
*   v5.00.00    2013/11/15  FJ）寺園    OM-2013-0003663
*   v10.00.00   2014/09/19  FJ）中野    OM-2014-0002994
*
**********************************************************************/

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.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.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK2441ETMsg;
import eo.ejb.cbm.entity.KK2451ETMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK2451DBABase;

/**
 * <p>
 * 他事業者割引契約制約部品クラスです
 * </p>
 * @author 富士通
 */
public class JKKejbKK2451KRCK extends JKKejbKK2451DBABase
{

	/** 日付：最大値 */
	private static final String DATE_MAX = "20991231";

	/**
	 * <p>
	 * 新しいJKKejbKK2451KRCKを作成します。
	 * </p>
	 */
	public JKKejbKK2451KRCK()
	{
	}

	/**
	 * <p>
	 * 他事業者割引契約適用範囲チェックを行う
	 * </p>
	 * @param inMsg チェック対象のETMsg(KK2451ETMsg)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 適用範囲内の場合はtrue。適用範囲外の場合はfalse
	 */
	public boolean isCheckTajgswkeiTgkeiYmd(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		// ETメッセージ
		CAANMsg inMsg2 = new CAANMsg(KK2451ETMsg.class.getName());
		inMsg2.set(KK2451ETMsg.TAJGS_WRIB_KEI_NO, inMsg.getString(KK2451ETMsg.TAJGS_WRIB_KEI_NO));
		inMsg2.set(KK2451ETMsg.TAJGSWKEI_TGKEI_NO, inMsg.getString(KK2451ETMsg.TAJGSWKEI_TGKEI_NO));

		// カレントレコードの情報を確認する（最新のデータが適用範囲内であるかを確認）
		CAANMsg rsltMsg = findByCurrent(inMsg2);

		//存在しない場合
		if (rsltMsg == null)
		{
			return false;
		}

		// 存在する場合
		// 他事業者割引契約対象契約適用開始年月日が運用日より大きい、
		// かつ、他事業者割引契約対象契約適用終了年月日が運用日より小さいまたは"20991231"と等しい
		String unyoYmd = JKKModelCommon.getOpeDate(inMsg);
		if (unyoYmd.compareTo(rsltMsg.getString(KK2451ETMsg.TAJGSWKEI_TGKEI_TSTAYMD)) >= 0
				&& (unyoYmd.compareTo(rsltMsg.getString(KK2451ETMsg.TAJGSWKEI_TGKEI_TENDYMD)) <= 0 
						|| DATE_MAX.equals(rsltMsg.getString(KK2451ETMsg.TAJGSWKEI_TGKEI_TENDYMD))))
		{
			return true;
		}
		
		// 適用範囲外の場合
		return false;
	}

	/**
	 * <p>
	 * 他事業者割引契約存在チェック
	 * サービス契約番号に紐付く他事業者割引契約が存在するかをチェックする。
	 * </p>
	 * @param  inMsg     処理対象のメッセージキャリア
	 * @param  inContext ディスパッチコンテキスト
	 * @param  svcKeiNo  サービス契約番号
	 * @return false:存在する場合、true:存在しない場合
	 */
	public boolean isTajgsWribKei(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK2441ETMsg.getTableName());

			// SQL文
			StringBuffer sbSql = new StringBuffer();

			sbSql.append(" SELECT  ");
			sbSql.append("      COUNT(*) AS CNT ");
			sbSql.append(" FROM KK_T_TAJGS_WRIB_KEI KK2441  ");
			sbSql.append(" WHERE (KK2441.TAJGS_WRIB_KEI_CNCL_YMD IS NULL OR KK2441.TAJGS_WRIB_KEI_CNCL_YMD = '20991231')  ");
			// OM-2014-0002994 ADD START
			sbSql.append("   AND (KK2441.TAJGS_WRIB_KEI_DSL_YMD IS NULL OR KK2441.TAJGS_WRIB_KEI_DSL_YMD = '20991231')  ");
			// OM-2014-0002994 ADD END
			sbSql.append("   AND (KK2441.TAJGS_WRIB_KEI_NO, KK2441.GENE_ADD_DTM) =  ");
			sbSql.append("        (SELECT KK2441_GENE.TAJGS_WRIB_KEI_NO, MAX(KK2441_GENE.GENE_ADD_DTM) AS KK2441_MAX  ");
			sbSql.append("         FROM KK_T_TAJGS_WRIB_KEI KK2441_GENE  ");
			sbSql.append("         WHERE KK2441_GENE.TAJGS_WRIB_KEI_NO = KK2441.TAJGS_WRIB_KEI_NO  ");
			sbSql.append("           AND KK2441_GENE.MK_FLG = '0'   ");
			sbSql.append("           GROUP BY KK2441_GENE.TAJGS_WRIB_KEI_NO)  ");
			sbSql.append("   AND EXISTS (  ");
			sbSql.append("         SELECT 1  ");
			sbSql.append("         FROM KK_T_TAJGSWKEI_TGKEI KK2451  ");
			sbSql.append("         WHERE KK2451.TAJGS_WRIB_KEI_NO = KK2441.TAJGS_WRIB_KEI_NO  ");
			sbSql.append("           AND KK2451.SVC_KEI_NO = ?  ");
			sbSql.append("           AND KK2451.TAJGSWKEI_TGKEI_TSTAYMD <= ?  ");
			sbSql.append("           AND KK2451.TAJGSWKEI_TGKEI_TENDYMD >= ?  ");
			sbSql.append("           AND (KK2451.TAJGS_WRIB_KEI_NO, KK2451.TAJGSWKEI_TGKEI_NO, KK2451.GENE_ADD_DTM) =  ");
			sbSql.append("                (SELECT KK2451_GENE.TAJGS_WRIB_KEI_NO, KK2451_GENE.TAJGSWKEI_TGKEI_NO, MAX(KK2451_GENE.GENE_ADD_DTM) AS KK2451_MAX  ");
			sbSql.append("                 FROM KK_T_TAJGSWKEI_TGKEI KK2451_GENE  ");
			sbSql.append("                 WHERE KK2451_GENE.TAJGS_WRIB_KEI_NO = KK2451.TAJGS_WRIB_KEI_NO  ");
			sbSql.append("                   AND KK2451_GENE.TAJGSWKEI_TGKEI_NO = KK2451.TAJGSWKEI_TGKEI_NO  ");
			sbSql.append("                   AND KK2451_GENE.MK_FLG = '0'   ");
			sbSql.append("                   GROUP BY KK2451_GENE.TAJGS_WRIB_KEI_NO, KK2451_GENE.TAJGSWKEI_TGKEI_NO)  ");
			sbSql.append("       )  ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sbSql);

			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			if (rsltQuery.next())
			{
				if(rsltQuery.getInt("CNT") > 0)
				{
					return false;
				}
			}
			return true;
		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}
}
