/*********************************************************************
*	All Rights reserved,Copyright c Fujitsu, 2011
**********************************************************************
*＜プログラム内容＞
*	システム名		：プロジェクト共通
*	モジュール名	：JCHejbCH0021CRCK
*	ソースファイル名：JCHejbCH0021CRCK.java
*	作成者			：富士通
*	日付			：2011年07月29日
*＜機能概要＞
*	債権内訳の関連チェックを行うクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/29	富士通		新規作成
*	v32.00.00	2017/05/29	FJ)河邊		【OM-2017-0000488】オープンカーソルエラー
*
**********************************************************************/
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.entity.CH0011ETMsg;
import eo.ejb.cbm.entity.CH0021ETMsg;
import eo.ejb.cbm.entity.CH0191ETMsg;
import eo.ejb.cbm.entity.CH0401ETMsg;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JPCModelCommon;
import eo.ejb.common.JSYejbSysDate;
import eo.ejb.common.db.JCHejbCH0191DBABase;
import eo.ejb.cbm.cbmmsg.CH0011CBMMsg;

/**
 * 金庫の関連チェックを行うクラスです。<p>
 * <br>
 * @author 富士通
 */
public class JCHejbCH0191KRCK
{
	
	private static final String KNK_SCHEMA_ID = "CH0191";
	
	/**
	 * <p>
	 * 貸倒後入金額チェック処理
	 * </p>
	 * 貸倒後入金額のチェックを行います。
	 * <br>
	 * @param inMsg 処理対象のメッセージ
	 * @param inContext エージェントディスパッチコンテキスト
	 * @param inSeiKyuNo 請求契約番号
	 * @param inKnkAmnt  移動先金庫金額
	 * @return チェックOK：true、NG：false
	 */
	public static boolean isKsdorNyukinAmnt001(CAANMsg inMsg,	AgentDispatchContext inContext,
			Object inSeiKyuNo, Object inKnkAmnt, Object inKnkPrcKmkCd)
	{
		
		//----------------------------------------------------
		// 処理済金（貸倒後入金）の取得
		//----------------------------------------------------
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt1 = null;
		PreparedStatement pstmt2 = null;
		PreparedStatement pstmt3 = null;
		
		// リザルトセット
		ResultSet rsltQuery1 = null;
		ResultSet rsltQuery2 = null;
		ResultSet rsltQuery3 = null;
		
		// 戻り値
		boolean bRtn = false;
		
		// 債権番号
		String sSaikenNo = null;
		
		// パラメータの取得
		String sSeiKyuNo = (String)inSeiKyuNo;
		Long lKnkAmnt = new Long(inKnkAmnt.toString());

		// パラメータインデックス
		int i = 1;

		/******************** 
		 * SQL文の作成
		 ********************/
		try
		{
			// システムパラメータ管理から処理済金（貸倒入金）の料金項目コードを取得する。
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());
			
			StringBuffer sql_Buff_Sys = new StringBuffer();
			sql_Buff_Sys.append(" SELECT ")
						.append("   CH0401.PRC_KMK_CD ")
						.append(" FROM ")
						.append("   CH_M_PRC_KMK_CS_CHGE CH0401 ")
						.append("  ,ZM_M_WORK_PARAM_KNRI ZM0321 ")
						.append(" WHERE ")
						.append("      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_SRZ_KASHID_AT' ")
						.append("  AND ZM0321.WORK_PARAM_TSTAYMD <= ? ")
						.append("  AND ZM0321.WORK_PARAM_TENDYMD >= ? ")
						.append("  AND ZM0321.MK_FLG = '0' ");
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
					JCHejbCH0191KRCK.class, sql_Buff_Sys);
			
			//prepareStatementにSQL文をセット
			pstmt1 = con1.prepareStatement(sql_Buff_Sys.toString());
			
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt1, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt1, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt1, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt1, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			
			// ResultSetの取得
			rsltQuery1 = pstmt1.executeQuery();
			
			// 戻り値の判定
			if (rsltQuery1.next())
			{
				// 料金項目コードを取得する。
				String sPrcKmkCd = rsltQuery1.getString("PRC_KMK_CD");
				
				if(!inKnkPrcKmkCd.equals(sPrcKmkCd)){
					return true;
				}
			}
			
			//----------------------------------------------------
			// 債権.債権番号の取得
			//----------------------------------------------------
			
// OM-2017-0000488 2017/05/29 ADD START
			if (con1 != null)
			{
				CAANConnectionMgr.getInstance().close(con1);
			}
// OM-2017-0000488 2017/05/29 ADD END
			
			// コネクション
			con1 = null;
			
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("   CH0011.SAIKEN_NO ")
					.append(" FROM ")
					.append("  CH_T_SAIKEN CH0011 ")
					.append(" WHERE ")
					.append("      CH0011.SEIKY_KEI_NO = ? ")
					.append("  AND CH0011.SAIKEN_STAT = '080' ")
					.append("  AND CH0011.MK_FLG = '0' ");
			
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0011ETMsg.getTableName());
			
			//prepareStatementにSQL文をセット
			pstmt2 = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
					JCHejbCH0191KRCK.class, sql_Buff);
			
			i = 1;
			// パラメータの設定(請求契約番号を指定)
			CAANJDBCUtil.setParam(pstmt2, i++, sSeiKyuNo);
			
			// ResultSetの取得
			rsltQuery2 = pstmt2.executeQuery();
			
			// 戻り値の判定
			if (rsltQuery2.next())
			{
				sSaikenNo = rsltQuery2.getString("SAIKEN_NO");
			}
		}
		catch (SQLException e)
		{
			inMsg.set(CH0011CBMMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery1 != null){
					rsltQuery1.close();
				}
				if (rsltQuery2 != null){
					rsltQuery2.close();
				}
				if (pstmt1 != null){
					pstmt1.close();
				}
				if (pstmt2 != null){
					pstmt2.close();
				}
				if (con1 != null){
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				inMsg.set(CH0011ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
		//----------------------------------------------------
		// 債権内訳.金額の取得
		//----------------------------------------------------
		
		// コネクション
		con1 = null;
		
		// パラメータインデックス
		 i = 1;

		/******************** 
		 * SQL文の作成
		 ********************/
		try
		{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0011ETMsg.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 = ? ")
					.append("  AND CH0021.MK_FLG = '0' ");
			
			
			//prepareStatementにSQL文をセット
			pstmt3 = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
					JCHejbCH0191KRCK.class, sql_Buff);
			
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt3, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt3, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt3, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt3, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			// パラメータの設定(債権番号を指定)
			CAANJDBCUtil.setParam(pstmt3, i++, sSaikenNo);
			
			// ResultSetの取得
			rsltQuery3 = pstmt3.executeQuery();
			
			// 戻り値の判定
			if (rsltQuery3.next())
			{
				Long lAmnt = rsltQuery3.getLong("AMNT");
				if ( lAmnt < lKnkAmnt ) {
					// 移動先金庫金額が貸倒済み債権の未納金額をこえたらfalse
					bRtn = false;
				} else {
					bRtn = true;
				}
			}
			
			
		}
		catch (SQLException e)
		{
			inMsg.set(CH0011CBMMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery3 != null){
					rsltQuery3.close();
				}
				if (pstmt3 != null){
					pstmt3.close();
				}
				if (con1 != null){
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				inMsg.set(CH0011ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
		return bRtn;
	}
	
	/**
	 * <p>
	 * 指定されたシステムパラメータIDに紐付くコードと
	 * カレントレコードの料金項目コードが一致するかチェックを行う
	 * </p>
	 * 
	 * @param inMsg     処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param knkNo     金庫番号
	 * @param sysParaId システムパラメータID
	 * 
	 * @return 一致する：true
	 *          一致しない：false
	 */
	public static boolean isSameKnkPrcKmkCd(CAANMsg inMsg, AgentDispatchContext inContext, Object knkNo, Object sysParaId)
	{
		// パラメータチェック
		if (knkNo == null || sysParaId == null)
		{
			return false;
		}
		
		// 金庫取得（カレントレコード）
		CAANMsg msg = new CAANMsg(CH0191ETMsg.class.getName());
		msg.set(CH0191ETMsg.KNK_NO, knkNo);
		
		CAANMsg crtMsg = new JCHejbCH0191DBABase().findByCurrent(msg);
		
		// インスタンス
		JCHejbCH0191KRCK ch0191krck = new JCHejbCH0191KRCK();
		
		// 料金項目コードが仮受付かチェックする
		return crtMsg.getString(CH0191ETMsg.KNK_PRC_KMK_CD).equals(
				ch0191krck.getSysParaCdForWorkKinoSkbt(inMsg, inContext, sysParaId.toString()));
	}
	
	/**
	 * <p>
	 * パラメータで渡された金庫番号を持つレコードのロックを行う。
	 * </p>
	 * @param inMsg     処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param trgKnkNo  ロック対象の金庫番号
	 * @return ロックできたらtrue
	 *          存在しない、ロック済みならfalse
	 */
	public static boolean recordLockForCH0191 (CAANMsg inMsg, AgentDispatchContext inContext, Object trgKnkNo)
	{
		CAANMsg tempMsg = new CAANMsg(CH0191ETMsg.class.getName());
		
		// レコードロック用のMsgにinMsgの値をコピーする
		tempMsg.setMsgDataOfAll(inMsg);
		
		// ロック対象の金庫番号を設定する
		tempMsg.set(CH0191ETMsg.KNK_NO, trgKnkNo);
		
		// レコードロック部品を呼び出す
		return JPCModelCommon.succeededExclusiveLockForGene(tempMsg, inContext, KNK_SCHEMA_ID);
	}
	
	/**
	 * <p>
	 * システムパラメータIDからコードを取得する
	 * </p>
	 * @param inMsg     処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param sysParaId システムパラメータID
	 * 
	 * @return システムパラメータIDに紐付くコード
	 */
	private String getSysParaCdForWorkKinoSkbt(CAANMsg inMsg, 
			AgentDispatchContext inContext, String sysParaId)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		
		try{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0021ETMsg.getTableName());

			StringBuffer sql_Buff = new StringBuffer();

			/******************** 
			 * SQL文の作成
			 ********************/

			sql_Buff.append(" SELECT ")
					.append(" CH0401.PRC_KMK_CD ")
					.append(" FROM ")
					.append("  CH_M_PRC_KMK_CS_CHGE CH0401 ")
					.append("  INNER JOIN ZM_M_WORK_PARAM_KNRI ZM0321 ")
					.append("  ON CH0401.WORK_KINO_SKBT_CD = ZM0321.WORK_PARAM_SETTE_VALUE ")
					.append("  AND ? BETWEEN ZM0321.WORK_PARAM_TSTAYMD AND ZM0321.WORK_PARAM_TENDYMD ")
					.append("  AND ZM0321.WORK_PARAM_ID = ?")
					.append("  AND ZM0321.MK_FLG = '0' ")
					.append(" WHERE ")
					.append("  CH0401.SYS_CD = 'CH' ")
					.append("  AND ? BETWEEN CH0401.PRC_KMK_CS_CHGE_TSTAYMD AND CH0401.PRC_KMK_CS_CHGE_TENDYMD ")
					.append("  AND CH0401.MK_FLG = '0' ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 1, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(システムパラメータID)
			CAANJDBCUtil.setParam(pstmt, 2, sysParaId);
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 3, JCCModelCommon.getOpeDate(inMsg, null));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			if(rsltQuery.next())
			{
				// 値が取得できたら返却する
				return rsltQuery.getString(CH0401ETMsg.PRC_KMK_CD);
			}
		}catch (SQLException e){

			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)
			{
				throw new CAANRuntimeException(e);
			}
		}
		return null;
	}
}
