/*********************************************************************
*	All Rights reserved,Copyright c Fujitsu, 2011
**********************************************************************
*＜プログラム内容＞
*	システム名		：プロジェクト共通
*	モジュール名	：JCHejbCH0021CRCK
*	ソースファイル名：JCHejbCH0021CRCK.java
*	作成者			：富士通
*	日付			：2011年07月29日
*＜機能概要＞
*	債権内訳の関連チェックを行うクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/29	富士通		新規作成
*
**********************************************************************/
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.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.cbmmsg.CH0011CBMMsg;
import eo.ejb.cbm.entity.CH0021ETMsg;
import eo.ejb.cbs.cbsmsg.ECH0011C012CBSMsg;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JPCModelCommon;

/**
 * 債権内訳の関連チェックを行うクラスです。<p>
 * <br>
 * @author 富士通
 */
public class JCHejbCH0021KRCK
{
	
	/**
	 * <p>
	 * 未収額整合性チェック処理
	 * </p>
	 * 未収額の整合性チェックを行います。
	 * <br>
	 * @param inMsg 処理対象のメッセージ
	 * @param inContext エージェントディスパッチコンテキスト
	 * @param inSaikenNo 債権番号
	 * @param inJutoAmnt 充当額
	 * @return チェックOK：true、NG：false
	 */
	public static boolean isMisyuAmntCheck(CAANMsg inMsg,	AgentDispatchContext inContext,
			Object inSaikenNo, Object inJutoAmnt)
	{
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		// 戻り値
		boolean bRtn = false;
		
		// パラメータの取得
		String sSaikenNo = (String)inSaikenNo;
		Long lJutoAmnt = new Long(inJutoAmnt.toString());

		// パラメータインデックス
		int i = 1;

		/******************** 
		 * SQL文の作成
		 ********************/
		try
		{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0021ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("  CH0021.AMNT ")
					.append(" FROM ")
					.append("  CH_T_SAIKEN_UCWK CH0021 ")
					.append(" ,CH_M_PRC_KMK_CS_CHGE CH0401 ")
					.append(" ,ZM_M_WORK_PARAM_KNRI ZM0321 ")
					.append(" WHERE ")
					.append("      CH0021.PRC_GRP_CD = CH0401.PRC_GRP_CD ")
					.append("  AND CH0021.PCRS_CD = CH0401.PCRS_CD ")
					.append("  AND CH0021.PRC_SVC_CD = CH0401.PRC_SVC_CD ")
					.append("  AND CH0021.PRC_KMK_CD = CH0401.PRC_KMK_CD ")
					.append("  AND CH0401.SYS_CD = 'CH' ")
					.append("  AND CH0401.WORK_KINO_SKBT_CD = ZM0321.WORK_PARAM_SETTE_VALUE ")
					.append("  AND CH0401.PRC_KMK_CS_CHGE_TSTAYMD <= ? ")
					.append("  AND CH0401.PRC_KMK_CS_CHGE_TENDYMD >= ? ")
					.append("  AND CH0401.MK_FLG = '0' ")
					.append("  AND ZM0321.WORK_PARAM_ID = 'CH_WKS_MISYU_KINGAKU' ")
					.append("  AND ZM0321.WORK_PARAM_TSTAYMD <= ? ")
					.append("  AND ZM0321.WORK_PARAM_TENDYMD >= ? ")
					.append("  AND ZM0321.MK_FLG = '0' ")
					.append("  AND CH0021.SAIKEN_NO = ? ");
			
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
					JCHejbCH0021KRCK.class, sql_Buff);
			
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, i++, sSaikenNo);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 戻り値の判定
			if (rsltQuery.next())
			{
				// 未収額を取得する
				String sMisyuAmnt = rsltQuery.getString("AMNT");
				// 未収額と充当額の差額(更新後未収額)を取得する
				Long lSagaku = Long.parseLong(sMisyuAmnt) - lJutoAmnt;
				if (lSagaku >= 0)
				{
					// 差額 >= 0 の場合、未収額に差額を設定し、trueを返却する
					inMsg.set(ECH0011C012CBSMsg.MISYU_AMNT, lSagaku.toString());
					bRtn = true;
				} else {
					// 差額 < 0 の場合、falseを返却する
					bRtn = false;
				}
			}
		}
		catch (SQLException e)
		{
			inMsg.set(CH0011CBMMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				inMsg.set(CH0021ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}

		return bRtn;
	}
	
	/**
	 * <p>
	 * 債権内訳存在チェック
	 * </p>
	 * 業務機能識別コードに紐づく債権内訳が存在するかチェックを行う。
	 * <br>
	 * @param inMsg 処理対象のメッセージ
	 * @param inContext エージェントディスパッチコンテキスト
	 * @return チェックOK：True、NG：False
	 */
	public static boolean isExistCheck(CAANMsg inMsg, AgentDispatchContext inContext, String sysParamBunruiCD, String sysParamID)
	{
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;
		
		// 戻り値
		boolean bRtn = false;

		/******************** 
		 * SQL文の作成
		 ********************/
		try{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0021ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("   COUNT(*) CNT ")
					.append(" FROM ")
					.append(" 	CH_T_SAIKEN_UCWK CH0021 ")
					.append(" 	INNER JOIN ")
					.append(" 		(SELECT ")
					.append(" 			 CH0401.PRC_GRP_CD ")
					.append(" 			,CH0401.PCRS_CD ")
					.append(" 			,CH0401.PRC_SVC_CD ")
					.append(" 			,CH0401.PRC_KMK_CD ")
					.append(" 		FROM ")
					.append(" 			CH_M_PRC_KMK_CS_CHGE CH0401 ")
					.append(" 			INNER JOIN ")
					.append(" 				ZM_M_SYS_PARAM_KNRI ZM0311 ")
					.append(" 			ON ")
					.append(" 					CH0401.WORK_KINO_SKBT_CD = ZM0311.SYS_PARAM_SETTE_VALUE_1 ")
					.append(" 				AND ZM0311.SYS_PARAM_BUNRUI_CD = ? ")
					.append(" 				AND ZM0311.SYS_PARAM_ID = ? ")
					.append(" 				AND ? BETWEEN ZM0311.SYS_PARAM_TSTAYMD AND ZM0311.SYS_PARAM_TENDYMD ")
					.append(" 				AND ZM0311.MK_FLG = '0' ")
					.append(" 		WHERE ")
					.append(" 				CH0401.SYS_CD = 'CH' ")
					.append(" 			AND CH0401.CHSHT_CHG_CD = '1' ")
					.append(" 			AND ? BETWEEN CH0401.PRC_KMK_CS_CHGE_TSTAYMD AND CH0401.PRC_KMK_CS_CHGE_TENDYMD ")
					.append(" 			AND CH0401.MK_FLG = '0' ")
					.append(" 			AND CH0401.RSV_APLY_YMD || CH0401.GENE_ADD_DTM = ")
					.append(" 				(SELECT ")
					.append(" 					MAX(CH0401_GENE.RSV_APLY_YMD || CH0401_GENE.GENE_ADD_DTM) AS CH0401_MAX ")
					.append(" 				FROM ")
					.append(" 					CH_M_PRC_KMK_CS_CHGE CH0401_GENE ")
					.append(" 				WHERE ")
					.append(" 						CH0401_GENE.SYS_CD = CH0401.SYS_CD ")
					.append(" 					AND CH0401_GENE.WORK_KINO_SKBT_CD = CH0401.WORK_KINO_SKBT_CD ")
					.append(" 					AND CH0401_GENE.CHSHT_CHG_CD = CH0401.CHSHT_CHG_CD ")
					.append(" 					AND CH0401_GENE.PRC_GRP_CD = CH0401.PRC_GRP_CD ")
					.append(" 					AND CH0401_GENE.PCRS_CD = CH0401.PCRS_CD ")
					.append(" 					AND CH0401_GENE.PRC_SVC_CD = CH0401.PRC_SVC_CD ")
					.append(" 					AND CH0401_GENE.PRC_KMK_CD = CH0401.PRC_KMK_CD ")
					.append(" 					AND CH0401_GENE.RSV_APLY_YMD <= ? ")
					.append(" 					AND CH0401_GENE.MK_FLG = '0') ")
					.append(" 		ORDER BY CH0401.PRC_KMK_CD,CH0401.PRC_GRP_CD) CH0401 ")
					.append(" 	ON ")
					.append(" 			CH0021.PRC_GRP_CD = CH0401.PRC_GRP_CD ")
					.append(" 		AND CH0021.PCRS_CD = CH0401.PCRS_CD ")
					.append(" 		AND CH0021.PRC_SVC_CD = CH0401.PRC_SVC_CD ")
					.append(" 		AND CH0021.PRC_KMK_CD = CH0401.PRC_KMK_CD ")
					.append(" WHERE ")
					.append("      	CH0021.SAIKEN_NO = ? ")
					.append("  	AND CH0021.MK_FLG = '0' ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,JCHejbCH0021KRCK.class, sql_Buff);
			
			// パラメータインデックス
			int i = 1;

			// パラメータの設定(システムパラメータ分類コード)
			CAANJDBCUtil.setParam(pstmt, i++, sysParamBunruiCD);
			// パラメータの設定(システムパラメータID)
			CAANJDBCUtil.setParam(pstmt, i++, sysParamID);
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(債権番号)
			CAANJDBCUtil.setParam(pstmt, i++, inMsg.getString("saiken_no"));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 戻り値の判定
			if (rsltQuery.next()) 
			{
				if (rsltQuery.getLong("CNT") > 0)
				{
					// 取得件数 > 0 の場合trueを返却する
					bRtn = true;
				}
			}
		}
		catch (SQLException e)
		{
			inMsg.set(CH0021ETMsg.STATUS, StatusCodes.FIND_DB_ERR); 
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				inMsg.set(CH0021ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}

		return bRtn;
	}
}
