/*********************************************************************
*	All Rights reserved,Copyright c Fujitsu, 2011
**********************************************************************
*＜プログラム内容＞
*	システム名		：プロジェクト共通
*	モジュール名	：JACejbAC0171Checker
*	ソースファイル名：JACejbAC0171Checker.java
*	作成者			：富士通
*	日付			：2011年07月05日
*＜機能概要＞
*	一時金に関する短項目関連チェック部品を定義するクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/05	富士通		新規作成
*
**********************************************************************/
package eo.ejb.common.itemrelation;

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.base.CAANSQLFacility;

import eo.common.constant.JACStrConst;
import eo.ejb.common.JPCModelCommon;

/**
 * 一時金に関する制約部品を定義するクラスです。<p>
 * <br>
 * @author 富士通
 */
public class JACejbAC0171Checker extends CAANSQLFacility
{

	/**
	 * 料金スケジュール定義マスタよりイベント日付を取得します。
	 * @param inOpeDate オンライン運用日
	 * @param sql 取得するＳＱＬ
	 * @return イベント日付（存在しない場合ＮＵＬL）
	 */
	public String getPrevCalcDate(CAANMsg inMsg)
	{
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		// パラメータインデックス
		int i = 1;
		
		// 料金イベント年月日
		String sEventYmd = null;
		
		try
		{
			//コネクション取得
			con1 = super.getConnection("CH_M_PRC_SCHDL_TEIGI");
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(createSqlPrevPrc());
			
			// パラメータの設定(イベントコード（料金計算日）を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.EVENT_CD_PRC_CALC_DAY);
			// パラメータの設定(イベントコード（料金計算日）を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.EVENT_CD_PRC_CALC_DAY);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JPCModelCommon.getOpeDate(inMsg, null));
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 戻り値の判定
			if (rsltQuery.next())
			{
				// イベント日付を取得
				sEventYmd = rsltQuery.getString(1);
			}
		}
		catch (SQLException e)
		{
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (null != rsltQuery)
				{
					rsltQuery.close();
				}
				if (null != pstmt)
				{
					pstmt.close();
				}
				if (null != con1)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				throw new CAANRuntimeException(e);
			}
		}
		
		return sEventYmd;
	}
	
	
	/**
	 * 最新の料金計算が走行した日に対応する請求年月を取得する（同日は含まない）
	 * @return ＳＱＬ文
	 */
	private String createSqlPrevPrc()
	{
		StringBuffer sql_Buff = new StringBuffer();
		sql_Buff.append(" SELECT ")
				.append("   CH0501.SEIKY_YM ")
				.append(" FROM ")
				.append("   CH_M_PRC_SCHDL_TEIGI CH0501 ")
				.append(" WHERE ")
				.append("   CH0501.EVENT_CD      =  ? ")
				.append("   AND CH0501.EVENT_YMD =  ( ")
				.append("         SELECT  ")
				.append("            MAX(EVENT_YMD)")
				.append("         FROM ")
				.append("            CH_M_PRC_SCHDL_TEIGI CH0501_MAX")
				.append("         WHERE ")
				.append("            CH0501_MAX.EVENT_CD      =  ? ")
				.append("            AND CH0501_MAX.EVENT_YMD   < ?   ")
				.append("            AND CH0501_MAX.MK_FLG  = '0' ")
				.append("   ) ")
				.append("   AND CH0501.MK_FLG    = '0' ");
		
		return sql_Buff.toString();
	}
	
	

}
