/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCHejbCH0191SecProc
*	ソースファイル名：JCHejbCH0191SecProc.java
*	作成者			：富士通
*	日付			：2011年08月12日
*＜機能概要＞
*	金庫に対する副次処理を行う部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/12	富士通		新規作成
*	v3.00.00	2012/05/01	富士通		金庫移動登録時の移動元金庫を更新する際に
*                                 		履歴データフラグを"2"を設定するように修正
*   v5.00.00	2013/07/29  FJ) 河井   【IT1-2013-0001477】 移動先金庫番号の更新処理追加
*   v5.00.01	2013/07/30  FJ) 垣内   【LT-2013-0000595】 前受け充当金対応
*	v5.00.02	2014/08/13	FJ) 米谷   【TG-2013-0000806】入金取消時の金庫登録処理を修正
*	v5.00.02	2013/10/14	FJ) 小野   【OM-2013-0001717】金庫取消時の入金ステータス変更処理を修正。
*	v6.00.00	2014/01/08	FJ) 小野   【OM-2014-0000039】金庫取消時の入金変更処理を修正(入金が更新されない不具合を修正)。
*	v9.00.00	2014/06/24	FJ) 林     【OM-2014-0001815】抱き合わせ。機能コードのチェックなしの金庫番号発番処理を追加
*	v9.00.01	2014/09/21	FJ) 早崎   【OM-2014-0002986】金庫取消時の入金取消不備
*	v23.00.00	2016/04/05	FJ)岡田    【OM-2016-0000639】
*	v32.00.00	2017/05/29	FJ) 河邊   【OM-2017-0000488】オープンカーソルエラー
*	v67.00.00	2023/07/04	FJ)吉田    【IT1-2023-0000003】前受金充当増額範囲内で減額時会計不正
**********************************************************************/

package eo.ejb.common.db;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANException;
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.common.constant.JACStrConst;
import eo.common.util.JCRUtilCommon;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.CH0111ETMsg;
import eo.ejb.cbm.entity.CH0191ETMsg;
import eo.ejb.cbm.entity.CH0201ETMsg;
import eo.ejb.cbm.entity.CH0401ETMsg;
import eo.ejb.cbm.entity.CH0501ETMsg;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbs.cbsmsg.EAC0171D010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0101D011CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0191C020CBSMsg;
import eo.ejb.cbs.mainproc.JECH0011C012TPMA;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JCHModelCommon;
import eo.ejb.common.JPCModelCommon;
import eo.ejb.common.JSYejbSysDate;
import eo.ejb.common.edit.JCHejbCH0191NumberParts;

/**
 * <p>
 * 金庫に対する副次処理を行う部品です。
 * </p>
 * @author 富士通
 */
public class JCHejbCH0191SecProc extends JCHejbCH0191DBABase
{
	/** 履歴データフラグ(履歴データ) */
	private static final String RIREKI_DATA_FLG = "2";
	
	/** 料金集計内部データ（差額） */
	private static final String SAGAKU = "sagaku";
	
	/** キー：金庫番号 */
	private static final String KEY_KNK_NO = "knk_no";

	/** キー：金庫移動区分 */
	private static final String KEY_KNK_MOVE_CD = "knk_move_cd";

	/** キー：移動元金庫番号 */
	private static final String KEY_IDOMOTO_KNK_NO = "idomoto_knk_no";

	/** キー：統合先金庫番号 */
	private static final String KEY_TOGO_KNK_NO = "togo_knk_no";

	/** キー：入金番号 */
	private static final String KEY_NYUKIN_NO = "nyukin_no";

	/** キー：履歴データフラグ */
	private static final String KEY_RIREKI_DATA_FLG = "rireki_data_flg";

	/** キー：オペレータ_ID */
	private static final String KEY_OPERATORID = "operatorID";

	/** 金庫取消処理 SQL区分：金庫番号 */
	private static final String KNK_CL_KBN_KNK = "1";

	/** 金庫取消処理 SQL区分：移動元金庫番号 */
	private static final String KNK_CL_KBN_IDOMOTO = "2";

	/** 金庫取消処理 SQL区分：統合先金庫番号 */
	private static final String KNK_CL_KBN_TOGO = "3";

	/** 金庫取消処理 SQL区分：入金番号 */
	private static final String KNK_CL_KBN_NYUKIN = "4";

	/**
	 * コンストラクタです。
	 */
	public JCHejbCH0191SecProc()
	{
		super();
	}

	/**
	 * <p>
	 * 金庫の金額を更新する。
	 * </p>
	 * @param cbsMsg CBSメッセージ
	 * @param inKNK_NO 移動元金庫番号
	 * @param inKnkNoAf 移動先金庫番号
	 */
	public void updateAmnt(CAANMsg cbsMsg, AgentDispatchContext inContext, String inKNK_NO, String inKnkNoAf)
	{
		// 移動元の金庫を履歴データに更新する。
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		// パラメータインデックス
		int i = 1;
		
		// 移動元の世代登録年月日時分秒
		String sGeneAddDTM = null;
		try
		{
			// 移動元の金庫を取得する。
			/******************** 
			 * SQL文の作成
			 ********************/
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0191ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("   MAX(CH0191.GENE_ADD_DTM) AS CH0191_MAX ")
					.append(" FROM ")
					.append("  CH_T_KNK CH0191 ")
					.append(" WHERE ")
					.append("      CH0191.KNK_NO = ? ")
					.append("  AND CH0191.MK_FLG='0' ");
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// パラメータの設定(金庫番号を指定)
			CAANJDBCUtil.setParam(pstmt, i++, inKNK_NO);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 戻り値の判定
			if (rsltQuery.next())
			{
				sGeneAddDTM = rsltQuery.getString("CH0191_MAX");
			}
			
			// 移動元金庫番号を履歴データとして更新する。
			CAANMsg inETMsgKNK = new CAANMsg(CH0191ETMsg.class.getName());
			inETMsgKNK.set(CH0191ETMsg.KNK_NO, inKNK_NO);
			inETMsgKNK.set(CH0191ETMsg.GENE_ADD_DTM, sGeneAddDTM);
			inETMsgKNK.set(CH0191ETMsg.TOGO_KNK_NO, inKnkNoAf);
			inETMsgKNK.set(CH0191ETMsg.RIREKI_DATA_FLG, RIREKI_DATA_FLG);
			inETMsgKNK.set(CH0191ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsgKNK.set(CH0191ETMsg.UPD_OPEACNT, cbsMsg.getString(ECH0191C020CBSMsg.OPERATORID));
			super.update(inETMsgKNK);
		}
		catch (CAANException e)
		{
			throw new CAANRuntimeException(e);
		}
		catch (Exception 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)
			{
				cbsMsg.set(CH0191ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
	
	/**
	 * <p>
	 * レコードを履歴に更新します。
	 * </p>
	 * @param cbsMsg CBSメッセージ
	 * @param inKNK_NO 金庫番号
	 * @param inKnkNoAf 世代登録年月日
	 */
	public void updateRireki(CAANMsg cbsMsg, AgentDispatchContext inContext, String knkNo, String knkNoAft, String addDtm)
	{
		// 移動元の金庫を履歴データに更新する。
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		// 運用日付
		String opeDate = (String)JPCModelCommon.getOpeDate(cbsMsg, inContext, null);
		try
		{
			// 移動元金庫番号を履歴データとして更新する。
			CAANMsg inETMsgKNK = new CAANMsg(CH0191ETMsg.class.getName());
			inETMsgKNK.set(CH0191ETMsg.KNK_NO, knkNo);												// 金庫番号
			inETMsgKNK.set(CH0191ETMsg.GENE_ADD_DTM, addDtm);										// 世代登録年月日時分秒
			inETMsgKNK.set(CH0191ETMsg.KNK_IDO_YMD, opeDate);										// 金庫移動年月日
			inETMsgKNK.set(CH0191ETMsg.TOGO_KNK_NO, knkNoAft);										// 統合移動先金庫番号
			inETMsgKNK.set(CH0191ETMsg.RIREKI_DATA_FLG, RIREKI_DATA_FLG);							// 履歴フラグ(2：履歴)
			inETMsgKNK.set(CH0191ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsgKNK.set(CH0191ETMsg.UPD_OPEACNT, cbsMsg.getString(ECH0191C020CBSMsg.OPERATORID));
			super.update(inETMsgKNK);
		}
		catch (CAANException e)
		{
			throw new CAANRuntimeException(e);
		}
		catch (Exception 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)
			{
				cbsMsg.set(CH0191ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
	
	/**
	 * <p>
	 * 金庫取消変更の副次処理を行います。
	 * </p>
	 * 
	 * @param cbsMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param KnkNo 金庫番号
	 * @param bnkt_knk_no 統合先金庫番号
	 */
	public void KnkCacelUpDate (CAANMsg cbsMsg, AgentDispatchContext inContext, 
			String knkNo, String bnkt_knk_no)
	{
		try
		{
			// 金庫取得（カレントレコード）
			CAANMsg msg = new CAANMsg(CH0191ETMsg.class.getName());
			msg.set(CH0191ETMsg.KNK_NO, knkNo);
			
			CAANMsg crtMsg = new JCHejbCH0191DBABase().findByCurrent(msg);
			
			// 存在しない場合はRuntimeExceptionをスローする
			if (crtMsg == null)
			{
				throw new CAANRuntimeException();
			}
			
			CAANMsg updateMsg = new CAANMsg(CH0191ETMsg.class.getName());
			
			// 現在日時
			String nowTimestamp = cbsMsg.getString(ECH0191C020CBSMsg.OPERATEDATETIME);
			
			// 金庫番号
			updateMsg.set(CH0191ETMsg.KNK_NO, knkNo);
			// 世代登録年月日時分秒
			updateMsg.set(CH0191ETMsg.GENE_ADD_DTM, crtMsg.getString(CH0191ETMsg.GENE_ADD_DTM));
			// 統合先金庫番号
			updateMsg.set(CH0191ETMsg.TOGO_KNK_NO, bnkt_knk_no);
			// 履歴データフラグ
			updateMsg.set(CH0191ETMsg.RIREKI_DATA_FLG, RIREKI_DATA_FLG);
			// 更新年月日時分秒
			updateMsg.set(CH0191ETMsg.UPD_DTM, nowTimestamp);
			// 更新オペレータアカウント
			updateMsg.set(CH0191ETMsg.UPD_OPEACNT, cbsMsg.getString(ECH0191C020CBSMsg.UPD_OPEACNT));
			
			// 更新処理実行
			super.update(updateMsg);
		} 
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
	}
	
	/**
	 * <p>
	 * 移動元金庫が分割されているかチェックする。
	 * 移動元金庫分割チェック副次処理部品
	 * </p>
	 * 
	 * @param cbsMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @return retKnkBnktFlg 移動元金庫が分割されているか判定するフラグ
	 *                        0:分割なし、1:分割あり
	 */
	public String isIdomtKnkBnktChk(CAANMsg cbsMsg, AgentDispatchContext inContext){
		
		// 初期値 "0"：分割なし
		String sRetIdomtKnkBnktFlg = "0";
		
		/** (1)-1 以下の条件で金庫を検索し移動元金庫番号を取得する。 */
		String sIdomtKnkNo = null;
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		// パラメータインデックス
		int i = 1;
		
		try
		{
			// 移動元の金庫を取得する。
			/******************** 
			 * SQL文の作成
			 ********************/
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0191ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     CH0191.IDOMOTO_KNK_NO ")
					.append(" FROM ")
					.append("     CH_T_KNK CH0191 ")
					.append(" WHERE ")
					.append("     CH0191.KNK_NO = ? ")
					.append(" AND CH0191.GENE_ADD_DTM = ")
					.append("          ( SELECT ")
					.append("                MAX(CH0191_GENE.GENE_ADD_DTM) AS GENE_ADD_DTM ")
					.append("            FROM ")
					.append("                CH_T_KNK CH0191_GENE ")
					.append("            WHERE ")
					.append("                CH0191_GENE.KNK_NO = CH0191.KNK_NO ) ")
					.append(" AND CH0191.MK_FLG='0' ");
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// パラメータの設定(金庫番号を指定)
			CAANJDBCUtil.setParam(pstmt, i++, cbsMsg.getString(ECH0191C020CBSMsg.KNK_NO));
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 戻り値の判定
			if (rsltQuery.next())
			{
				sIdomtKnkNo = rsltQuery.getString("IDOMOTO_KNK_NO");
			}
			
		}
		catch (SQLException e)
		{
			throw new CAANRuntimeException(e);
		}
		catch (Exception e)
		{
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (null != rsltQuery) 
				{
					rsltQuery.close();
				}
				if (null != pstmt) 
				{
					pstmt.close();
				}
// OM-2017-0000488 2017/05/29 ADD START
				if (con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
// OM-2017-0000488 2017/05/29 ADD END
			}
			catch(SQLException e)
			{
				cbsMsg.set(CH0191ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
		if(sIdomtKnkNo == null){
			// 移動元金庫番号が取得できなかった場合、
			// 金庫分割されていないと判断し"0":分割なしを返却
			return sRetIdomtKnkBnktFlg;
		}
		
		/** (1)-2 上記で取得した移動元金庫番号で再度金庫を検索する。 */
		
		// プリペアステートメント
		pstmt = null;
		
		// リザルトセット
		rsltQuery = null;
		
		int iCnt = 0;
		
		i = 1;
		
		try
		{
			// 移動元の金庫を取得する。
			/******************** 
			 * SQL文の作成
			 ********************/
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0191ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     COUNT(*) CNT ")
					.append(" FROM ")
					.append("     CH_T_KNK CH0191 ")
					.append(" WHERE ")
					.append("     CH0191.IDOMOTO_KNK_NO = ? ")
					.append(" AND CH0191.GENE_ADD_DTM = ")
					.append("          ( SELECT ")
					.append("                MAX(CH0191_GENE.GENE_ADD_DTM) AS GENE_ADD_DTM ")
					.append("            FROM ")
					.append("                CH_T_KNK CH0191_GENE ")
					.append("            WHERE ")
					.append("                CH0191_GENE.KNK_NO = CH0191.KNK_NO ) ")
					.append(" AND CH0191.MK_FLG='0' ");
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// パラメータの設定(移動元金庫番号を指定)
			CAANJDBCUtil.setParam(pstmt, i++, sIdomtKnkNo);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 戻り値の判定
			if (rsltQuery.next())
			{
				iCnt = rsltQuery.getInt("CNT");
			}
		}
		catch (SQLException e)
		{
			throw new CAANRuntimeException(e);
		}
		catch (Exception 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)
			{
				cbsMsg.set(CH0191ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
		/** (1)-3 上記で取得した金庫の件数によって返却値を設定する。 */
		
		if(2 <= iCnt){
			// ２件以上ある場合は"1"：分割ありを設定する。
			sRetIdomtKnkBnktFlg = "1";
		}
		
		return sRetIdomtKnkBnktFlg;
	}

	/**
	 * <p>
	 * 移動元金庫が分割されているかチェックする。
	 * 移動元金庫分割チェック副次処理部品
	 * </p>
	 * 
	 * @param cbsMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @return 入金情報リスト
	 */
	public static List<HashMap<String, String>> getNyukinList(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 金庫番号
		String inKnkNo = inCBSMsg.getString(ECH0191C020CBSMsg.KNK_NO);

		// 金庫情報ワーク
		List<HashMap<String, String>> knkWorkList = new ArrayList<HashMap<String, String>>();

		// 金庫情報ワーク初期化
		HashMap<String, String> map = new HashMap<String, String>();
		map.put(KEY_KNK_NO, inKnkNo);
		map.put(KEY_IDOMOTO_KNK_NO, inCBSMsg.getString(ECH0191C020CBSMsg.IN_IDOMOTO_KNK_NO));
		map.put(KEY_TOGO_KNK_NO, inCBSMsg.getString(ECH0191C020CBSMsg.IN_TOGO_KNK_NO));
		map.put(KEY_KNK_MOVE_CD, inCBSMsg.getString(ECH0191C020CBSMsg.IN_KNK_MOVE_CD));
		map.put(KEY_NYUKIN_NO, inCBSMsg.getString(ECH0191C020CBSMsg.IN_NYUKIN_NO));
		knkWorkList.add(map);

		// 金庫情報ワークに重複した金庫番号を入れないように制御するマップ
		HashMap<String, String> tempKnkMap = new HashMap<String, String>();
		tempKnkMap.put(inKnkNo, null);

		// 入金情報ワーク
		List<HashMap<String, String>> nyukinWorkList = new ArrayList<HashMap<String, String>>();

		// 入金情報ワークに重複した入金番号を入れないように制御するマップ
		HashMap<String, String> tempNyukinMap = new HashMap<String, String>();

		for (int i = 0; i < knkWorkList.size(); i++)
		{
			HashMap<String, String> knkMap = knkWorkList.get(i);

			String knkNo = knkMap.get(KEY_KNK_NO);
			String idomotoKnkNo = knkMap.get(KEY_IDOMOTO_KNK_NO);
			String nyukinNo = knkMap.get(KEY_NYUKIN_NO);

			HashMap<String, String> nyukinWorkMap = new HashMap<String, String>();

			if (!JCRUtilCommon.isNull(nyukinNo))
			{
				nyukinWorkMap.put(KEY_NYUKIN_NO, nyukinNo);

				// 処理済マップに入っているものは対象外（入金情報ワークには重複分は入れない）
				if (!tempNyukinMap.containsKey(nyukinNo))
				{
					nyukinWorkList.add(nyukinWorkMap);
					tempNyukinMap.put(nyukinNo, null);
				}
			}
			else if (!JCRUtilCommon.isNull(idomotoKnkNo))
			{
				List<HashMap<String, String>> idomotoList =
					getKnkList(inCBSMsg, inContext, KNK_CL_KBN_KNK, idomotoKnkNo, tempKnkMap);
				knkWorkList.addAll(idomotoList);
			}
			else
			{
				List<HashMap<String, String>> togomotoList =
					getKnkList(inCBSMsg, inContext, KNK_CL_KBN_TOGO, knkNo, tempKnkMap);
				knkWorkList.addAll(togomotoList);
			}

		}

		return nyukinWorkList;
	}

	/**
	 * <p>
	 * 料金調整登録、料金変更登録の副次処理を行います。
	 * </p>
	 * 
	 * @param cbsMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param inDtMsg 料金調整変更登録時に作成した前受金充当の内部データ
	 */
	public void KnkAjstUpDate(CAANMsg cbsMsg, AgentDispatchContext inContext, CAANMsg inDtMsg)
	{
		
		// 金庫取得（カレントレコード）
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		// パラメータインデックス
		int i = 1;
		
		// 金庫リスト
		ArrayList<CAANMsg> alKnkMsgList = new ArrayList<CAANMsg>();
		
		try
		{
			/******************** 
			 * SQL文の作成
			 ********************/
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0191ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			
			sql_Buff.append(" SELECT ")
					.append("     CH0191.KNK_NO ")
					.append("    ,CH0191.GENE_ADD_DTM ")
					.append("    ,CH0191.KNK_MOVE_CD ")
					.append("    ,CH0191.SEIKY_KEI_NO ")
					.append("    ,CH0191.KNK_IDO_YMD ")
					.append("    ,CH0191.IDOMOTO_KNK_NO ")
					.append("    ,CH0191.TOGO_KNK_NO ")
					.append("    ,CH0191.NYUKIN_NO ")
					.append("    ,CH0191.KNK_PRC_KMK_CD ")
					.append("    ,CH0191.KNK_AMNT ")
					.append("    ,CH0191.SSN_WAY_CD ")
					.append(" FROM ")
					.append("     CH_T_KNK CH0191 ")
					.append(" WHERE ")
					.append("     CH0191.SEIKY_KEI_NO = ? ")
					.append(" AND CH0191.GENE_ADD_DTM =  ")
					.append("           (SELECT ")
					.append("                MAX(CH0191_GENE.GENE_ADD_DTM) AS GENE_ADD_DTM ")
					.append("            FROM ")
					.append("                CH_T_KNK CH0191_GENE ")
					.append("            WHERE ")
					.append("                CH0191_GENE.KNK_NO = CH0191.KNK_NO ")
					.append("            AND CH0191_GENE.MK_FLG = '0') ")
					.append(" AND CH0191.RIREKI_DATA_FLG = '1' ")
					.append(" AND CH0191.MK_FLG = '0' ")
					.append(" ORDER BY  CH0191.KNK_NO  ASC ");
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// パラメータの設定(金庫番号を指定)
			CAANJDBCUtil.setParam(pstmt, i++, inDtMsg.getString(ECH0101D011CBSMsg.SEIKY_KEI_NO));
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 取得した金庫を保持する。
			CAANMsg caKnkMsg = new CAANMsg(CH0191ETMsg.class.getName());
			
			while (rsltQuery.next()) {
				
				caKnkMsg.setPrivate(CH0191ETMsg.KNK_NO, rsltQuery.getString(CH0191ETMsg.KNK_NO));
				caKnkMsg.setPrivate(CH0191ETMsg.GENE_ADD_DTM, rsltQuery.getString(CH0191ETMsg.GENE_ADD_DTM));
				caKnkMsg.setPrivate(CH0191ETMsg.KNK_MOVE_CD, rsltQuery.getString(CH0191ETMsg.KNK_MOVE_CD));
				caKnkMsg.setPrivate(CH0191ETMsg.SEIKY_KEI_NO, rsltQuery.getString(CH0191ETMsg.SEIKY_KEI_NO));
				caKnkMsg.setPrivate(CH0191ETMsg.KNK_IDO_YMD, rsltQuery.getString(CH0191ETMsg.KNK_IDO_YMD));
				caKnkMsg.setPrivate(CH0191ETMsg.IDOMOTO_KNK_NO, rsltQuery.getString(CH0191ETMsg.IDOMOTO_KNK_NO));
				caKnkMsg.setPrivate(CH0191ETMsg.TOGO_KNK_NO, rsltQuery.getString(CH0191ETMsg.TOGO_KNK_NO));
				caKnkMsg.setPrivate(CH0191ETMsg.NYUKIN_NO, rsltQuery.getString(CH0191ETMsg.NYUKIN_NO));
				caKnkMsg.setPrivate(CH0191ETMsg.KNK_PRC_KMK_CD, rsltQuery.getString(CH0191ETMsg.KNK_PRC_KMK_CD));
				caKnkMsg.setPrivate(CH0191ETMsg.KNK_AMNT, rsltQuery.getString(CH0191ETMsg.KNK_AMNT));
				caKnkMsg.setPrivate(CH0191ETMsg.SSN_WAY_CD, rsltQuery.getString(CH0191ETMsg.SSN_WAY_CD));
				
				alKnkMsgList.add(caKnkMsg);
			}
		}
		catch (SQLException e)
		{
			cbsMsg.set(CH0191ETMsg.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)
			{
				cbsMsg.set(CH0191ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
		// 処理済金（前受金充当）の金庫を取得する。
		HashMap<String, String> hmResult = getPrcKmkCd(cbsMsg, inContext, "SYRZM_MAEUK_AT_JUTO");
		
		String sPrcKmkCd = hmResult.get("PRC_KMK_CD");
		
		// 前受金充当明細の差額を取得する。
		String sSagaku = inDtMsg.getString(SAGAKU);
		BigDecimal bdSagaku = new BigDecimal(sSagaku);
		
		/** 差額で金庫の処理済金（前受金充当）にあてこむ */
		try {
			// 処理済金（前受金充当）の金庫を取得する。
			for(CAANMsg caKnkMsg : alKnkMsgList){
				
				if(caKnkMsg.getString(CH0191ETMsg.KNK_PRC_KMK_CD).equals(sPrcKmkCd)){
					
					// 処理済金（前受金充当）の金庫の場合、金庫金額を減額して更新する。
					String sKnkAmnt = caKnkMsg.getString(CH0191ETMsg.KNK_AMNT);
					BigDecimal bdKnkAmnt = new BigDecimal(sKnkAmnt);
					
					// 処理済金（前受金充当）の金庫を履歴データに更新する。
					CAANMsg inETMsgKnkup = new CAANMsg(CH0191ETMsg.class.getName());
					inETMsgKnkup.set(CH0191ETMsg.KNK_NO, caKnkMsg.getString(CH0191ETMsg.KNK_NO));
					inETMsgKnkup.set(CH0191ETMsg.GENE_ADD_DTM, caKnkMsg.getString(CH0191ETMsg.GENE_ADD_DTM));
					inETMsgKnkup.set(CH0191ETMsg.RIREKI_DATA_FLG, JACStrConst.KNK_RIREKI_DATA_FLG_RIREKI);
					
					super.update(inETMsgKnkup);
					
					// 差額を処理済金（前受金充当）にあてこむ。
					if(bdKnkAmnt.compareTo(bdSagaku) == 0){
						// 金庫金額と差額が同値の場合
						
						// 差額と金庫金額が同値の場合、金庫の更新は行わず差額を0にする。
						bdSagaku = new BigDecimal("0");
					}
					else if(bdKnkAmnt.compareTo(bdSagaku) > 0){
						// 金庫金額が差額より大きい場合
						
						// 金庫金額から差額を引いた金額を処理済金（前受金充当）として登録する。
						BigDecimal bdUpKnkAmnt = bdKnkAmnt.subtract(bdSagaku);
						
						CAANMsg inETMsgKnkins = new CAANMsg(CH0191ETMsg.class.getName());
						inETMsgKnkins.set(CH0191ETMsg.KNK_NO, caKnkMsg.getString(CH0191ETMsg.KNK_NO));
						inETMsgKnkins.set(CH0191ETMsg.GENE_ADD_DTM, JPCModelCommon.getOpeDate(cbsMsg, inContext, null));
						inETMsgKnkins.set(CH0191ETMsg.KNK_MOVE_CD, caKnkMsg.getString(CH0191ETMsg.KNK_MOVE_CD));
						inETMsgKnkins.set(CH0191ETMsg.SEIKY_KEI_NO, caKnkMsg.getString(CH0191ETMsg.SEIKY_KEI_NO));
						inETMsgKnkins.set(CH0191ETMsg.KNK_IDO_YMD, caKnkMsg.getString(CH0191ETMsg.KNK_IDO_YMD));
						inETMsgKnkins.set(CH0191ETMsg.IDOMOTO_KNK_NO, caKnkMsg.getString(CH0191ETMsg.IDOMOTO_KNK_NO));
						inETMsgKnkins.set(CH0191ETMsg.TOGO_KNK_NO, caKnkMsg.getString(CH0191ETMsg.TOGO_KNK_NO));
						inETMsgKnkins.set(CH0191ETMsg.NYUKIN_NO, caKnkMsg.getString(CH0191ETMsg.NYUKIN_NO));
						inETMsgKnkins.set(CH0191ETMsg.KNK_PRC_KMK_CD, caKnkMsg.getString(CH0191ETMsg.KNK_PRC_KMK_CD));
						inETMsgKnkins.set(CH0191ETMsg.KNK_AMNT, String.valueOf(bdUpKnkAmnt));
						inETMsgKnkins.set(CH0191ETMsg.SSN_WAY_CD, caKnkMsg.getString(CH0191ETMsg.SSN_WAY_CD));
						inETMsgKnkins.set(CH0191ETMsg.SSN_WAY_CD, JACStrConst.KNK_RIREKI_DATA_FLG_CURRENT);
						inETMsgKnkins.set(CH0191ETMsg.ADD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
						inETMsgKnkins.set(CH0191ETMsg.ADD_OPEACNT, cbsMsg.getObject(EAC0171D010CBSMsg.OPERATORID));
						inETMsgKnkins.set(CH0191ETMsg.UPD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
						inETMsgKnkins.set(CH0191ETMsg.UPD_OPEACNT, cbsMsg.getObject(EAC0171D010CBSMsg.OPERATORID));
						inETMsgKnkins.set(CH0191ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);
						
						super.create(inETMsgKnkins);
						
						// 差額を0に設定する。
						bdSagaku = new BigDecimal("0");
					}
					else if(bdKnkAmnt.compareTo(bdSagaku) < 0){
						// 金庫金額が差額より小さい場合
						
						// 差額から金庫金額を減算する。
						bdSagaku = bdSagaku.subtract(bdKnkAmnt);
					}
					
					if(bdSagaku.compareTo(new BigDecimal("0")) <= 0){
						// 差額が0以下の場合は更新処理を終了する。
						break;
					}
				}
			}
		}
		catch (CAANException e) {
			
			throw new CAANRuntimeException(e);
			
		}
		catch (Exception e) {
			
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 金庫取消変更の副次処理として入金の更新を行います。
	 * </p>
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 */
	public void updateNyukinByKnkCl(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 金庫番号
		String inKnkNo = inCBSMsg.getString(ECH0191C020CBSMsg.KNK_NO);

		// 入金情報リスト取得（金庫取消により、入金取消の対象となる入金番号の候補を取得）
		List<HashMap<String, String>> nyukinList = getNyukinList(inCBSMsg, inContext);

		// 入金番号リストをもとに、この入金番号に関連する金庫がすべて取り消されているかどうかチェックする。
		// 一つでも有効な金庫が存在する場合、入金の更新は行わない。
		for (int i = 0; i < nyukinList.size(); i++)
		{
			// ----------------------------------------------------
			// 入金番号をもとに金庫を取得(⇒金庫情報ワークへ格納)。
			// ----------------------------------------------------
			HashMap<String, String> nyukinMap = nyukinList.get(i);

			// 入金番号
			String workNyukinNo = nyukinMap.get(KEY_NYUKIN_NO);

			// ワーク金庫番号マップ（重複した金庫番号をワークに入れないように制御する）
			HashMap<String, String> tmpKnkMap = new HashMap<String, String>();

			// 金庫情報ワーク
			List<HashMap<String, String>> knkWorkList =
				getKnkList(inCBSMsg, inContext, KNK_CL_KBN_NYUKIN, workNyukinNo, tmpKnkMap);

			// [true:有効な金庫が他に存在する（自分以外で）、false:有効な金庫が他に存在しない（自分以外で）]
			boolean knkYukoflg = false;

			HashMap<String, String> nyukinWorkMap = new HashMap<String, String>();

			// OM-2014-00002986 ADD START
			// C 複数の入金の金庫を統合操作された場合
			if(JCRUtilCommon.isNull(workNyukinNo))
			{
				knkYukoflg = true;
				break;
			}
			
			// @ 入金額の一部でも充当されている場合
			if(checkClrJutoInfo(inCBSMsg, inContext, workNyukinNo))
			{
				knkYukoflg = true;
				break;
			}
			
			// 入金取消時に作成された金庫件数
			int nyukinClrKnkCnt = 0;
			// OM-2014-00002986 ADD END
			
			// ----------------------------------------------------
			// この入金番号に関連する金庫がすべて取り消されているかどうかチェックする
			// ----------------------------------------------------
			for (int j = 0; j < knkWorkList.size(); j++)
			{
				HashMap<String, String> knkMap = knkWorkList.get(j);

				// 金庫番号
				String workKnkNo = knkMap.get(KEY_KNK_NO);

				// OM-2014-00002986 DEL START
//				// 統合先金庫番号
//				String workTogoKnkNo = knkMap.get(KEY_TOGO_KNK_NO);
//				// 履歴データフラグ
//				String workRirekiFlg = knkMap.get(KEY_RIREKI_DATA_FLG);
				// OM-2014-00002986 DEL END
				
				// OM-2014-00002986 ADD START
				// 金庫移動区分
				String workKnkMoveCd = knkMap.get(KEY_KNK_MOVE_CD);
				// 移動元金庫番号
				String workIdoMtknkNo = knkMap.get(KEY_IDOMOTO_KNK_NO);
				// OM-2014-00002986 ADD END

				tmpKnkMap.put(workKnkNo, null);
				
				// OM-2014-00002986 DEL START
//				if (!JCRUtilCommon.isNull(workTogoKnkNo))
//				{
//					List<HashMap<String, String>> togoSakiList =
//						getKnkList(inCBSMsg, inContext, KNK_CL_KBN_KNK, workTogoKnkNo, tmpKnkMap);
//					knkWorkList.addAll(togoSakiList);
//				}
//				else
//				{
//					List<HashMap<String, String>> idoSakiList =
//						getKnkList(inCBSMsg, inContext, KNK_CL_KBN_IDOMOTO, workKnkNo, tmpKnkMap);
//					knkWorkList.addAll(idoSakiList);
//				}

//				if (JACStrConst.KNK_RIREKI_DATA_FLG_CURRENT.equals(workRirekiFlg))
//				{
//					if (!inKnkNo.equals(workKnkNo))
//					{
//						nyukinWorkMap.put(inKnkNo, null);
//						knkYukoflg = true;
//						break;
//					}
//				}
				// OM-2014-00002986 DEL END
				
				// OM-2014-00002986 ADD START
				// B 金庫分割操作が行われた場合
				List<HashMap<String, String>> idoSakiList =
					getKnkList(inCBSMsg, inContext, KNK_CL_KBN_IDOMOTO, workKnkNo, tmpKnkMap);
				knkWorkList.addAll(idoSakiList);

				if (!inKnkNo.equals(workKnkNo))
				{
					nyukinWorkMap.put(inKnkNo, null);
					knkYukoflg = true;
					break;
				}

				// A 入金取消によって作成された金庫が複数存在する場合
				if(JACStrConst.KINKO_IDO_ADD.equals(workKnkMoveCd))
				{
					nyukinClrKnkCnt++;

					if(nyukinClrKnkCnt > 1)
					{
						knkYukoflg = true;
						break;
					}
				}
				// OM-2014-00002986 ADD END
			}

			// ----------------------------------------------------
			// 有効な金庫が他に存在しない（自分以外で）場合、入金を取り消す。
			// ----------------------------------------------------
			if (!knkYukoflg)
			{
				// 入金更新副次部品
				CAANMsg inETMsg = new CAANMsg(CH0111ETMsg.class.getName());
	
				// キー項目を設定
				inETMsg.set(CH0111ETMsg.NYUKIN_NO, workNyukinNo);
	
				// 更新項目を設定
				inETMsg.set(CH0111ETMsg.NYUKIN_STAT, JACStrConst.NYUKIN_STAT_CD_NYUKIN_CL);
				inETMsg.set(CH0111ETMsg.NYUKIN_CL_YMD, JPCModelCommon.getOnlineOpeDate(inCBSMsg, null));
				inETMsg.set(CH0111ETMsg.UPD_OPEACNT, inCBSMsg.getString(KEY_OPERATORID));
	
				// 入金更新副次部品を呼び出し、入金を更新
				JCHejbCH0111SecProc ch0111SecProc = new JCHejbCH0111SecProc();
				ch0111SecProc.executeKnkCl(inETMsg);
			}
		}

	}

	/**
	 * <p>
	 * 指定されたシステムパラメタＩＤの料金項目コードを取得する
	 * </p>
	 * 
	 * @param cbsMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param sSysParamId システムパラメタＩＤ
	 */
	private HashMap<String, String> getPrcKmkCd(CAANMsg inCBSMsg, AgentDispatchContext inContext, String sSysParamId){
		
		HashMap<String, String> hmRet = new HashMap<String, String>();
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		String sPCRS_CD = "";
		String sPRC_SVC_CD = "";
		String sPRC_KMK_CD = "";
		
		/******************** 
		 * SQL文の作成
		 ********************/
		
		try{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());
			
			// 料金項目抽出変換から消費税の料金項目コードを取得する。
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.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(" ,ZM_M_SYS_PARAM_KNRI ZM0311 ")
					.append(" WHERE ")
					.append("      CH0401.SYS_CD = 'CH' ")
					.append("  AND CH0401.WORK_KINO_SKBT_CD = ZM0311.SYS_PARAM_SETTE_VALUE_1 ")
					.append("  AND CH0401.PRC_KMK_CS_CHGE_TSTAYMD <= " + JCCModelCommon.getOpeDate(inCBSMsg, inContext, null))
					.append("  AND CH0401.PRC_KMK_CS_CHGE_TENDYMD >= " + JCCModelCommon.getOpeDate(inCBSMsg, inContext, null))
					.append("  AND ZM0311.SYS_PARAM_BUNRUI_CD = 'WORK_KINO_SKBT' ")
					.append("  AND ZM0311.SYS_PARAM_ID = '" + sSysParamId + "'");
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
					JECH0011C012TPMA.class, sql_Buff);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 戻り値の判定
			if (rsltQuery.next())
			{
				// 料金コースコードを取得
				sPCRS_CD = rsltQuery.getString(CH0401ETMsg.PCRS_CD);
				// 料金サービスコードを取得
				sPRC_SVC_CD = rsltQuery.getString(CH0401ETMsg.PRC_SVC_CD);
				// 料金項目コードを取得する
				sPRC_KMK_CD = rsltQuery.getString(CH0401ETMsg.PRC_KMK_CD);
				
				// マップに格納
				hmRet.put("PCRS_CD", sPCRS_CD);
				hmRet.put("PRC_SVC_CD", sPRC_SVC_CD);
				hmRet.put("PRC_KMK_CD", sPRC_KMK_CD);
			}
		}
		catch (SQLException e)
		{
			inCBSMsg.set(CH0401ETMsg.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)
			{
				inCBSMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
		return hmRet;
	}

	/**
	 * <p>
	 * ECH0101D011_料金調整登録、ECH0101D012_料金変更登録
	 * 金庫の更新・登録処理を行う。
	 * </p>
	 * 
	 * @param cbsMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param caPrcShukReslt 登録対象明細
	 */
	public void prcAjstKnkUpd(CAANMsg cbsMsg, AgentDispatchContext inContext, CAANMsg caPrcShukReslt)
	{
		// 金庫情報取得用料金項目コードリスト
		List<HashMap<String, String>> prcKmkList = null;
		// 金庫情報登録用料金項目コードリスト
		List<HashMap<String, String>> addPrcKmkList = null;

		// 差額
		BigDecimal sagaku = new BigDecimal(caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_SAGAKU));
		
		// 差額が0より小さい（前受金充当額が減額）の場合
		if(BigDecimal.ZERO.compareTo(sagaku) < 0)
		{
			// 処理済金（前受金充当）の料金項目コードを設定
			prcKmkList = getPrcKmkCsChge(cbsMsg, inContext, JACStrConst.WKPRA_CH_WKS_SRZ_MUK_AT_JT);
			// 預り金の料金項目コードを設定
			addPrcKmkList = getPrcKmkCsChge(cbsMsg, inContext, JACStrConst.WKPARA_CH_WKS_AZUKARI_AMNT);
		}
		else if(BigDecimal.ZERO.compareTo(sagaku) > 0)
		{
			// 前受金の料金項目コードを設定
			prcKmkList = getPrcKmkCsChge(cbsMsg, inContext, JACStrConst.WKPRA_CH_WKS_MAEUK_AT);
			// 処理済金（前受金充当）の料金項目コードを設定
			addPrcKmkList = getPrcKmkCsChge(cbsMsg, inContext, JACStrConst.WKPRA_CH_WKS_SRZ_MUK_AT_JT);
			// 差額をプラスにする
			sagaku = sagaku.multiply(new BigDecimal("-1"));
		}
		// 変更前後で変わらない場合は、更新しない
		else
		{
			return;
		}
		
		// 取得用料金項目コード
		String prcKmkCd = prcKmkList.get(0).get("PRC_KMK_CD");
		// 登録用料金項目コード
		String addPrcKmkCd = addPrcKmkList.get(0).get("PRC_KMK_CD");
		
		// 金庫取得（カレントレコード）
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		// パラメータインデックス
		int i = 1;
		
		// 金庫リスト
		ArrayList<CAANMsg> alKnkMsgList = new ArrayList<CAANMsg>();
		
		// 一次保持リスト
		ArrayList<CAANMsg> rsltMsgList = new ArrayList<CAANMsg>();
		
		try
		{
			/******************** 
			 * SQL文の作成
			 ********************/
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0191ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			
			sql_Buff.append(" SELECT ")
					.append("     CH0191.KNK_NO ")
					.append("    ,CH0191.GENE_ADD_DTM ")
					.append("    ,CH0191.KNK_MOVE_CD ")
					.append("    ,CH0191.SEIKY_KEI_NO ")
					.append("    ,CH0191.KNK_IDO_YMD ")
					.append("    ,CH0191.IDOMOTO_KNK_NO ")
					.append("    ,CH0191.TOGO_KNK_NO ")
					.append("    ,CH0191.NYUKIN_NO ")
					.append("    ,CH0191.KNK_PRC_KMK_CD ")
					.append("    ,CH0191.KNK_AMNT ")
					.append("    ,CH0191.SSN_WAY_CD ")
					.append(" FROM ")
					.append("     CH_T_KNK CH0191 ")
					.append(" WHERE ")
					.append("     CH0191.SEIKY_KEI_NO = ? ")
					.append(" AND CH0191.GENE_ADD_DTM =  ")
					.append("           (SELECT ")
					.append("                MAX(CH0191_GENE.GENE_ADD_DTM) AS GENE_ADD_DTM ")
					.append("            FROM ")
					.append("                CH_T_KNK CH0191_GENE ")
					.append("            WHERE ")
					.append("                CH0191_GENE.KNK_NO = CH0191.KNK_NO ")
					.append("            AND CH0191_GENE.MK_FLG = '0') ")
					.append(" AND CH0191.KNK_PRC_KMK_CD = ? ")
					.append(" AND CH0191.RIREKI_DATA_FLG = '1' ")
					.append(" AND CH0191.MK_FLG = '0' ")
					.append(" ORDER BY  CH0191.KNK_NO  DESC ");
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// パラメータの設定(請求契約番号)
			CAANJDBCUtil.setParam(pstmt, i++, cbsMsg.getString(ECH0101D011CBSMsg.SEIKY_KEI_NO));
			// パラメータの設定(料金項目コード)
			CAANJDBCUtil.setParam(pstmt, i++, prcKmkCd);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			String[] msgKeyList1 = {
					CH0191ETMsg.KNK_NO,
					CH0191ETMsg.GENE_ADD_DTM,
					CH0191ETMsg.KNK_MOVE_CD,
					CH0191ETMsg.SEIKY_KEI_NO,
					CH0191ETMsg.KNK_IDO_YMD,
					CH0191ETMsg.IDOMOTO_KNK_NO,
					CH0191ETMsg.TOGO_KNK_NO,
					CH0191ETMsg.NYUKIN_NO,
					CH0191ETMsg.KNK_PRC_KMK_CD,
					CH0191ETMsg.KNK_AMNT,
					CH0191ETMsg.SSN_WAY_CD,
			};

			// 取得結果をメッセージに退避する。
			// 結果を明細にセットする。
			while (rsltQuery.next())
			{
				CAANMsg rsltMsg = new CAANMsg();
				
				for (int n = 0; n < msgKeyList1.length; n++)
				{
					String key = msgKeyList1[n];
					
					rsltMsg.setPrivate(key, CAANJDBCUtil.getString(rsltQuery, n + 1));
				}
				
				rsltMsgList.add(rsltMsg);
			}
			
			// マップに格納する。
			for (CAANMsg msg : rsltMsgList)
			{
				alKnkMsgList.add(msg);
			}
		}
		catch (SQLException e)
		{
			cbsMsg.set(CH0191ETMsg.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)
			{
				cbsMsg.set(CH0191ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
		// 差額を金庫にあてこむ
		try 
		{
		// IT1-2023-0000003 ADD START
		// 料金スケジュール定義.イベントコード=12:会計処理日（運用日当日を含まない直近過去）
		CAANMsg[] prcScdl21 = JCHModelCommon.getPrcSchdlNotContain(cbsMsg, inContext, JACStrConst.EVENT_CD_KAIK_SHORI_YMD);
		// 当月会計処理日
		String togtKaikTrnYmd = prcScdl21[0].getString(CH0501ETMsg.EVENT_YMD);
		
		// 処理済金（前受金充当）の料金項目コードを設定
		prcKmkList = getPrcKmkCsChge(cbsMsg, inContext, JACStrConst.WKPRA_CH_WKS_SRZ_MUK_AT_JT);
		String prcKmkCdSrzMukAtJt = prcKmkList.get(0).get("PRC_KMK_CD");
		// 処理済金（前受金充当）の料金項目コードでなければ何もしない
		// IT1-2023-0000003 ADD END
		
			// 金庫を取得
			for(int n = 0; n < alKnkMsgList.size(); n++)
			{
				CAANMsg caKnkMsg = alKnkMsgList.get(n);
				
				if(caKnkMsg.getString(CH0191ETMsg.KNK_PRC_KMK_CD).equals(prcKmkCd))
				{
					// 移動先金庫番号（分割の際は設定しない）
					String addKnkdNo = JACStrConst.KARA_MOJI;
					
					// 更新処理終了フラグ
					Boolean trnFlg = false;
					
					// 金庫金額
					String sKnkAmnt = caKnkMsg.getString(CH0191ETMsg.KNK_AMNT);
					BigDecimal bdKnkAmnt = new BigDecimal(sKnkAmnt);
					
					// IT1-2023-0000003 ADD START
					// 金庫移動日
					String sKnkIdoYmd = caKnkMsg.getString(CH0191ETMsg.KNK_IDO_YMD);
					
					// 金庫異動日が当月会計処理日(当日含む)より過去、かつ登録料金項目コードが「処理済み（前受金充当）」の場合
					if(togtKaikTrnYmd.compareTo(sKnkIdoYmd) >= 0 && prcKmkCdSrzMukAtJt.equals(prcKmkCd))
					{
						// 既に会計計上済のため、一時金にマイナス登録する。
						// 一時金の副次問い合わせ
						JCHejbAC0171SecProc AC0171 = new JCHejbAC0171SecProc();
						AC0171.prcAjstIcjknMaeuke(cbsMsg, inContext, caPrcShukReslt, bdKnkAmnt.negate(), prcKmkCd);
					}
					// IT1-2023-0000003 ADD END
					
					// 金庫金額が差額より大きい場合
					if(bdKnkAmnt.compareTo(sagaku) > 0)
					{
						// 金庫金額から差額を減算
						bdKnkAmnt = bdKnkAmnt.subtract(sagaku);

						// 金庫金額を取得用料金項目コードで金庫テーブルに登録
						executeAddKnk(cbsMsg, caKnkMsg, inContext, caPrcShukReslt, prcKmkCd, bdKnkAmnt, JACStrConst.KINKO_IDO_BNKT);
						
						// 差額を登録用料金項目コードで金庫テーブルに登録
						executeAddKnk(cbsMsg, caKnkMsg, inContext, caPrcShukReslt, addPrcKmkCd, sagaku, JACStrConst.KINKO_IDO_BNKT);
						
						// 更新処理を終了
						trnFlg = true;
					}
					// 金庫金額と差額が同値の場合
					else if(bdKnkAmnt.compareTo(sagaku) == 0)
					{
						// 差額を登録用料金項目コードで金庫テーブルに登録
						addKnkdNo = executeAddKnk(cbsMsg, caKnkMsg, inContext, caPrcShukReslt, addPrcKmkCd, sagaku, JACStrConst.KINKO_IDO_CD);

						// 更新処理を終了
						trnFlg = true;
					}
					// 金庫金額が差額より小さい場合
					else if(bdKnkAmnt.compareTo(sagaku) < 0)
					{
						// 金庫金額を登録用料金項目コードで金庫テーブルに登録
						addKnkdNo = executeAddKnk(cbsMsg, caKnkMsg, inContext, caPrcShukReslt, addPrcKmkCd, bdKnkAmnt, JACStrConst.KINKO_IDO_CD);

						// 差額から金庫金額を減算
						sagaku = sagaku.subtract(bdKnkAmnt);
					}

					// 金庫を履歴データに更新
					CAANMsg inETMsgKnkUpd = new CAANMsg(CH0191ETMsg.class.getName());
					inETMsgKnkUpd.set(CH0191ETMsg.KNK_NO, caKnkMsg.getString(CH0191ETMsg.KNK_NO));
					inETMsgKnkUpd.set(CH0191ETMsg.GENE_ADD_DTM, caKnkMsg.getString(CH0191ETMsg.GENE_ADD_DTM));
					inETMsgKnkUpd.set(CH0191ETMsg.TOGO_KNK_NO, addKnkdNo);
					inETMsgKnkUpd.set(CH0191ETMsg.RIREKI_DATA_FLG, JACStrConst.KNK_RIREKI_DATA_FLG_RIREKI);
					inETMsgKnkUpd.set(CH0191ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
					inETMsgKnkUpd.set(CH0191ETMsg.UPD_OPEACNT, cbsMsg.getString(CH0191ETMsg.OPERATORID));
					
					super.update(inETMsgKnkUpd);
					
					if(trnFlg)
					{
						// 更新処理を終了
						break;
					}
				}
			}
		}
		catch (CAANException ex)
		{
			throw new CAANRuntimeException(ex);
		}
		catch (Exception e)
		{
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 料金項目抽出変換取得実行処理。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param workParamId 業務パラメータID
	 * @return 料金項目抽出変換リスト
	 */
	private List<HashMap<String, String>> getPrcKmkCsChge(CAANMsg inCBSMsg, AgentDispatchContext inContext, String workParamId)
	{
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		/******************** 
		 * SQL文の作成
		 ********************/
		try
		{
			// 運用日付
			String opeDate = (String)JPCModelCommon.getOpeDate(inCBSMsg, inContext, null);

			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = JCHModelCommon.getPrcKmkCsChgeSql(false);

			// 返却用リスト
			List<HashMap<String, String>> retList = new ArrayList<HashMap<String, String>>();

			// パラメータ設定リスト
			List<Object> replaceListCnt = new ArrayList<Object>();
			replaceListCnt.add(JACStrConst.SYS_CD_CH);
			replaceListCnt.add(JACStrConst.CHSHT_CHG_CD_1);
			replaceListCnt.add(opeDate);
			replaceListCnt.add(workParamId);
			replaceListCnt.add(opeDate);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JCHejbCH0101SecProc.class, sql_Buff);

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			for (int idx = 0; idx < replaceListCnt.size(); idx++)
			{
				CAANJDBCUtil.setParam(pstmt, idx + 1, replaceListCnt.get(idx));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			if (rsltQuery.next())
			{
				HashMap<String, String> map = new HashMap<String, String>();
				map.put("PRC_GRP_CD", rsltQuery.getString("PRC_GRP_CD"));
				map.put("PCRS_CD", rsltQuery.getString("PCRS_CD"));
				map.put("PRC_SVC_CD", rsltQuery.getString("PRC_SVC_CD"));
				map.put("PRC_KMK_CD", rsltQuery.getString("PRC_KMK_CD"));
				retList.add(map);
			}

			return retList;
		}
		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)
			{
				inCBSMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	/**
	 * <p>
	 * 金庫登録実行処理
	 * </p>
	 * @param cbsMsg 処理対象のメッセージキャリア
	 * @param caKnkMsg 登録対象金庫情報
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param caPrcShukReslt 登録対象明細
	 * @param prcKmkCd 料金項目コード
	 * @param bdKnkAmnt 金額
	 * @param knkMoveCd 金庫移動コード
	 * @return sKnkAddSeq 登録した金庫番号
	 */
	private String executeAddKnk(CAANMsg cbsMsg, CAANMsg caKnkMsg, AgentDispatchContext inContext, CAANMsg caPrcShukReslt
								, String prcKmkCd, BigDecimal bdKnkAmnt, String knkMoveCd)
	{
		try 
		{
			String ssnWayCd = JACStrConst.KARA_MOJI;
			// 処理済金（前受金充当）の料金項目コードを取得
			List<HashMap<String, String>> prcKmkList = getPrcKmkCsChge(cbsMsg, inContext, JACStrConst.WKPRA_CH_WKS_SRZ_MUK_AT_JT);
			String prcKmkCdSrzMukJt = prcKmkList.get(0).get("PRC_KMK_CD");
			
			if(prcKmkCd.equals(prcKmkCdSrzMukJt))
			{
				// 精算方法コードを前受金充当に設定
				ssnWayCd = JACStrConst.JUTO_SISAN_MAEUKEKINJUTO;
				// 金庫移動コードを処理済移動に設定
				knkMoveCd = JACStrConst.KINKO_IDO_SYORI_ZUMI;
			}
			
			// 金庫登録番号を算出
			String sKnkAddSeq = JCHejbCH0191NumberParts.getKnkNo();

			CAANMsg inETMsgKnkIns = new CAANMsg(CH0191ETMsg.class.getName());
			inETMsgKnkIns.set(CH0191ETMsg.KNK_NO, sKnkAddSeq);
			inETMsgKnkIns.set(CH0191ETMsg.GENE_ADD_DTM, JPCModelCommon.getOpeDateTimeStamp(cbsMsg, inContext, null));
			inETMsgKnkIns.set(CH0191ETMsg.KNK_MOVE_CD, knkMoveCd);
			inETMsgKnkIns.set(CH0191ETMsg.SEIKY_KEI_NO, caKnkMsg.getString(CH0191ETMsg.SEIKY_KEI_NO));
			inETMsgKnkIns.set(CH0191ETMsg.KNK_IDO_YMD, JPCModelCommon.getOpeDate(cbsMsg, inContext, null));
			inETMsgKnkIns.set(CH0191ETMsg.IDOMOTO_KNK_NO, caKnkMsg.getString(CH0191ETMsg.KNK_NO));
			inETMsgKnkIns.set(CH0191ETMsg.TOGO_KNK_NO, JACStrConst.KARA_MOJI);
			inETMsgKnkIns.set(CH0191ETMsg.NYUKIN_NO, JACStrConst.KARA_MOJI);
			inETMsgKnkIns.set(CH0191ETMsg.KNK_PRC_KMK_CD, prcKmkCd);
			inETMsgKnkIns.set(CH0191ETMsg.KNK_AMNT, String.valueOf(bdKnkAmnt));
			inETMsgKnkIns.set(CH0191ETMsg.SSN_WAY_CD, ssnWayCd);
			inETMsgKnkIns.set(CH0191ETMsg.RIREKI_DATA_FLG, JACStrConst.KNK_RIREKI_DATA_FLG_CURRENT);
			inETMsgKnkIns.set(CH0191ETMsg.ADD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
			inETMsgKnkIns.set(CH0191ETMsg.ADD_OPEACNT, cbsMsg.getObject(CH0191ETMsg.OPERATORID));
			inETMsgKnkIns.set(CH0191ETMsg.UPD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
			inETMsgKnkIns.set(CH0191ETMsg.UPD_OPEACNT, cbsMsg.getObject(CH0191ETMsg.OPERATORID));
			inETMsgKnkIns.set(CH0191ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);
			
			super.create(inETMsgKnkIns);
			return sKnkAddSeq;
		}
		catch (CAANException ex) 
		{
			throw new CAANRuntimeException(ex);
		} 
		catch (Exception e) 
		{
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 統合元金庫取得実行処理。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param knkClKbn 金庫取消区分
	 * @param inputNo 入力番号（金庫番号または入金番号）
	 * @param tmpKnkMap ワーク金庫番号マップ（重複した金庫番号をワークに入れないように制御する）
	 * @return 金庫リスト
	 */
	public static List<HashMap<String, String>> getKnkList(CAANMsg inCBSMsg, AgentDispatchContext inContext,
			String knkClKbn ,String inputNo, HashMap<String, String> tmpKnkMap)
	{
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		/******************** 
		 * SQL文の作成
		 ********************/
		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0191ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = null;
			if (KNK_CL_KBN_KNK.equals(knkClKbn))
			{
				sql_Buff = getKnkByKnkNoSql();
			}
			else if (KNK_CL_KBN_IDOMOTO.equals(knkClKbn))
			{
				sql_Buff = getKnkByIdomotoKnkNoSql();
			}
			else if (KNK_CL_KBN_TOGO.equals(knkClKbn))
			{
				sql_Buff = getKnkByTogoKnkNoSql();
			}
			else if (KNK_CL_KBN_NYUKIN.equals(knkClKbn))
			{
				sql_Buff = getKnkByNyukinNoSql();
			}

			// 返却用リスト
			List<HashMap<String, String>> retList = new ArrayList<HashMap<String, String>>();

			// パラメータ設定リスト
			List<Object> replaceListCnt = new ArrayList<Object>();
			replaceListCnt.add(inputNo);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JCHejbCH0191SecProc.class, sql_Buff);

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			for (int idx = 0; idx < replaceListCnt.size(); idx++)
			{
				CAANJDBCUtil.setParam(pstmt, idx + 1, replaceListCnt.get(idx));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			while (rsltQuery.next())
			{
				HashMap<String, String> map = new HashMap<String, String>();
				String rsKnkNo = rsltQuery.getString("KNK_NO");
				map.put(KEY_KNK_NO, rsKnkNo);
				map.put(KEY_KNK_MOVE_CD, rsltQuery.getString("KNK_MOVE_CD"));
				map.put(KEY_NYUKIN_NO, rsltQuery.getString("NYUKIN_NO"));
				map.put(KEY_IDOMOTO_KNK_NO, rsltQuery.getString("IDOMOTO_KNK_NO"));
				map.put(KEY_TOGO_KNK_NO, rsltQuery.getString("TOGO_KNK_NO"));
				map.put(KEY_RIREKI_DATA_FLG, rsltQuery.getString("RIREKI_DATA_FLG"));

				if (!tmpKnkMap.containsKey(rsKnkNo))
				{
					retList.add(map);
					tmpKnkMap.put(rsKnkNo, null);
				}
			}

			return retList;
		}
		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)
			{
				inCBSMsg.set(CH0191ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	// OM-2014-00002986 ADD START
	/**
	 * <p>
	 * 充当情報取消チェック処理
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param nyukinNo 入金番号
	 * @return チェック処理結果
	 */
	public boolean checkClrJutoInfo(CAANMsg inCBSMsg, AgentDispatchContext inContext, String nyukinNo)
	{
		boolean retRslt = false;
		
		List<HashMap<String, String>> jutoInfoList= new ArrayList<HashMap<String, String>>();
		
		// 入金番号に紐づく充当情報を取得する
		jutoInfoList = getJutoInfo(inCBSMsg, inContext, nyukinNo);
		
		for(int i = 0; i < jutoInfoList.size(); i++)
		{
			
			HashMap<String, String> tmpMap= new HashMap<String, String>();
			tmpMap = jutoInfoList.get(i);
			
			// 取消年月日
			String clYmd = tmpMap.get("cl_ymd");
			
			if(JCRUtilCommon.isNull(clYmd))
			{
				retRslt = true;
			}
		}
		
		return retRslt;
	}
	
	/**
	 * <p>
	 * 充当情報取得処理
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param nyukinNo 入金番号
	 * @return 充当情報
	 */
	public List<HashMap<String, String>> getJutoInfo(CAANMsg inCBSMsg, AgentDispatchContext inContext, String nyukinNo){
		
		// 返却マップ
		List<HashMap<String, String>> retList = new ArrayList<HashMap<String, String>>();
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		/******************** 
		 * SQL文の作成
		 ********************/
		
		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0201ETMsg.getTableName());
			
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append(" 	CH0201.JUTO_NO, ")
					.append(" 	CH0201.CL_YMD ")
					.append(" FROM ")
					.append(" 	CH_T_JUTO CH0201 ")
					.append(" WHERE ")
					.append(" 	CH0201.NYUKIN_NO = ? AND ")
					.append(" 	CH0201.MK_FLG    = '0' ");
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JCHejbCH0191SecProc.class, sql_Buff);
			
			int i = 1;
			// パラメータの設定(入金番号を指定)
			CAANJDBCUtil.setParam(pstmt, i++, nyukinNo);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			while (rsltQuery.next())
			{
				HashMap<String, String> map = new HashMap<String, String>();
				
				map.put("juto_no", rsltQuery.getString("juto_no"));
				map.put("cl_ymd", rsltQuery.getString("cl_ymd"));
				
				retList.add(map);
			}
		}
		catch(SQLException e) 
		{
			inCBSMsg.set(CH0191ETMsg.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)
			{
				inCBSMsg.set(CH0191ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
		return retList;
	}
	// OM-2014-00002986 ADD END
	
	
	/**
	 * <p>
	 * 金庫を取得するSQLを作成する（キー：金庫番号）。<br>
	 * </p>
	 * @return StringBuffer
	 */
	private static StringBuffer getKnkByKnkNoSql()
	{
		StringBuffer sql_Buff = new StringBuffer();

		sql_Buff.append(" SELECT ")
				.append("     CH0191.KNK_NO, ")
				.append("     CH0191.KNK_MOVE_CD, ")
				.append("     CH0191.NYUKIN_NO, ")
				.append("     CH0191.IDOMOTO_KNK_NO, ")
				.append("     CH0191.TOGO_KNK_NO, ")
				.append("     CH0191.RIREKI_DATA_FLG ")
				.append(" FROM ")
				.append("     CH_T_KNK CH0191 ")
				.append(" WHERE ")
				.append("     CH0191.KNK_NO = ? ")
				.append("     AND CH0191.KNK_MOVE_CD <> '09' ")
				.append("     AND CH0191.MK_FLG = '0' ")
				.append(" ORDER BY ")
				.append("     CH0191.KNK_NO ");

		return sql_Buff;
	}

	/**
	 * <p>
	 * 金庫を取得するSQLを作成する（キー：移動元金庫番号）。<br>
	 * </p>
	 * @return StringBuffer
	 */
	private static StringBuffer getKnkByIdomotoKnkNoSql()
	{
		StringBuffer sql_Buff = new StringBuffer();

		sql_Buff.append(" SELECT ")
				.append("     CH0191.KNK_NO, ")
				.append("     CH0191.KNK_MOVE_CD, ")
				.append("     CH0191.NYUKIN_NO, ")
				.append("     CH0191.IDOMOTO_KNK_NO, ")
				.append("     CH0191.TOGO_KNK_NO, ")
				.append("     CH0191.RIREKI_DATA_FLG ")
				.append(" FROM ")
				.append("     CH_T_KNK CH0191 ")
				.append(" WHERE ")
				.append("     CH0191.IDOMOTO_KNK_NO = ? ")
				.append("     AND CH0191.KNK_MOVE_CD <> '09' ")
				.append("     AND CH0191.MK_FLG = '0' ")
				.append(" ORDER BY ")
				.append("     CH0191.KNK_NO ");

		return sql_Buff;
	}

	/**
	 * <p>
	 * 金庫を取得するSQLを作成する（キー：統合金庫番号）。<br>
	 * </p>
	 * @return StringBuffer
	 */
	private static StringBuffer getKnkByTogoKnkNoSql()
	{
		StringBuffer sql_Buff = new StringBuffer();

		sql_Buff.append(" SELECT ")
				.append("     CH0191.KNK_NO, ")
				.append("     CH0191.KNK_MOVE_CD, ")
				.append("     CH0191.NYUKIN_NO, ")
				.append("     CH0191.IDOMOTO_KNK_NO, ")
				.append("     CH0191.TOGO_KNK_NO, ")
				.append("     CH0191.RIREKI_DATA_FLG ")
				.append(" FROM ")
				.append("     CH_T_KNK CH0191 ")
				.append(" WHERE ")
				.append("     CH0191.KNK_NO ")
				.append("     IN ")
				.append("     ( ")
				.append("         SELECT ")
				.append("             CH0191_SUB.KNK_NO ")
				.append("         FROM ")
				.append("             CH_T_KNK CH0191_SUB ")
				.append("         WHERE ")
				.append("             CH0191_SUB.TOGO_KNK_NO = ? ")
				.append("             AND CH0191_SUB.MK_FLG = '0' ")
				.append("     ) ")
				.append("     AND CH0191.KNK_MOVE_CD <> '09' ")
				.append(" ORDER BY ")
				.append("     CH0191.KNK_NO ");

		return sql_Buff;
	}

	/**
	 * <p>
	 * 金庫を取得するSQLを作成する（キー：入金番号）。<br>
	 * </p>
	 * @return StringBuffer
	 */
	private static StringBuffer getKnkByNyukinNoSql()
	{
		StringBuffer sql_Buff = new StringBuffer();

		sql_Buff.append(" SELECT ")
				.append("     CH0191.KNK_NO, ")
				.append("     CH0191.KNK_MOVE_CD, ")
				.append("     CH0191.NYUKIN_NO, ")
				.append("     CH0191.IDOMOTO_KNK_NO, ")
				.append("     CH0191.TOGO_KNK_NO, ")
				.append("     CH0191.RIREKI_DATA_FLG ")
				.append(" FROM ")
				.append("     CH_T_KNK CH0191 ")
				.append(" WHERE ")
				.append("     CH0191.NYUKIN_NO = ? ")
				.append("     AND CH0191.KNK_MOVE_CD <> '09' ")
				.append("     AND CH0191.MK_FLG = '0' ")
				.append(" ORDER BY ")
				.append("     CH0191.KNK_NO ");

		return sql_Buff;
	}

	// v23.00.00 ADD START
	/**
	 * <p>
	 * 金庫、入金データを取得する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param knkNo 金庫番号
	 */
	public CAANMsg[] getKnkInfo(CAANMsg inCBSMsg, AgentDispatchContext inContext, String knkNo)
	{
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0191ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			
    		sql_Buff.append(" SELECT ")
					.append("      CH0191.KNK_NO, ")
					.append("      CH0191.GENE_ADD_DTM, ")
					.append("      CH0191.KNK_MOVE_CD, ")
					.append("      CH0191.SEIKY_KEI_NO, ")
					.append("      CH0191.KNK_IDO_YMD, ")
					.append("      CH0191.IDOMOTO_KNK_NO, ")
					.append("      CH0191.TOGO_KNK_NO, ")
					.append("      CH0191.NYUKIN_NO, ")
					.append("      CH0191.KNK_PRC_KMK_CD, ")
					.append("      CH0191.KNK_AMNT, ")
					.append("      CH0191.SSN_WAY_CD, ")
					.append("      CH0191.RIREKI_DATA_FLG, ")
					.append("      CH0111.NYUKIN_NO, ")
					.append("      CH0111.NYUKIN_ROUTE_CD, ")
					.append("      CH0111.NYUKIN_TRN_YMD, ")
					.append("      CH0111.NYUKIN_TRN_HMS ")
					.append("   FROM ")
					.append("      CH_T_KNK CH0191 ")
					.append("      LEFT  JOIN ")
					.append("            CH_T_NYUKIN CH0111 ")
					.append("            ON  CH0191.NYUKIN_NO = CH0111.NYUKIN_NO ")
					.append("            AND CH0111.MK_FLG = '0' ")
					.append("  WHERE ")
					.append("      CH0191.IDOMOTO_KNK_NO = ? ")
					.append("      AND CH0191.KNK_MOVE_CD <> '09' ")
					.append("      AND CH0191.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, knkNo);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			String[] msgKeyList1 = {
					CH0191ETMsg.KNK_NO,
					CH0191ETMsg.GENE_ADD_DTM,
					CH0191ETMsg.KNK_MOVE_CD,
					CH0191ETMsg.SEIKY_KEI_NO,
					CH0191ETMsg.KNK_IDO_YMD,
					CH0191ETMsg.IDOMOTO_KNK_NO,
					CH0191ETMsg.TOGO_KNK_NO,
					CH0191ETMsg.NYUKIN_NO,
					CH0191ETMsg.KNK_PRC_KMK_CD,
					CH0191ETMsg.KNK_AMNT,
					CH0191ETMsg.SSN_WAY_CD,
					CH0191ETMsg.RIREKI_DATA_FLG,
					CH0111ETMsg.NYUKIN_NO,
					CH0111ETMsg.NYUKIN_ROUTE_CD,
					CH0111ETMsg.NYUKIN_TRN_YMD,
					CH0111ETMsg.NYUKIN_TRN_HMS
			};

			// 返却用リスト
			ArrayList<CAANMsg> retArray = new ArrayList<CAANMsg>();

			while (rsltQuery.next())
			{
				CAANMsg rsltMsg = new CAANMsg();
				
				for (int n = 0; n < msgKeyList1.length; n++)
				{
					String key = msgKeyList1[n];
					
					rsltMsg.setPrivate(key, CAANJDBCUtil.getString(rsltQuery, n + 1));
				}
				retArray.add(rsltMsg);
			}
			return retArray.toArray(new CAANMsg[0]);
		}
		catch (SQLException e)
		{
			inCBSMsg.set(CH0191ETMsg.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)
			{
				inCBSMsg.set(CH0191ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
	/**
	 * <p>
	 * 金庫、入金データを取得する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param seikyKeiNo 請求契約番号
	 */
	public CAANMsg[] getKnkInfoIdxSeiky(CAANMsg inCBSMsg, AgentDispatchContext inContext, String seikyKeiNo)
	{
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0191ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			
    		sql_Buff.append(" SELECT ")
			.append("      CH0191.KNK_NO, ")
			.append("      CH0191.GENE_ADD_DTM, ")
			.append("      CH0191.KNK_MOVE_CD, ")
			.append("      CH0191.SEIKY_KEI_NO, ")
			.append("      CH0191.KNK_IDO_YMD, ")
			.append("      CH0191.IDOMOTO_KNK_NO, ")
			.append("      CH0191.TOGO_KNK_NO, ")
			.append("      CH0191.NYUKIN_NO, ")
			.append("      CH0191.KNK_PRC_KMK_CD, ")
			.append("      CH0191.KNK_AMNT, ")
			.append("      CH0191.SSN_WAY_CD, ")
			.append("      CH0191.RIREKI_DATA_FLG, ")
			.append("      CH0111.NYUKIN_NO, ")
			.append("      CH0111.NYUKIN_ROUTE_CD, ")
			.append("      CH0111.NYUKIN_TRN_YMD, ")
			.append("      CH0111.NYUKIN_TRN_HMS ")
			.append("   FROM ")
			.append("      CH_T_KNK CH0191 ")
			.append("      LEFT  JOIN ")
			.append("            CH_T_NYUKIN CH0111 ")
			.append("            ON  CH0191.NYUKIN_NO = CH0111.NYUKIN_NO ")
			.append("            AND CH0111.MK_FLG = '0' ")
			.append("  WHERE ")
			.append("      CH0191.SEIKY_KEI_NO = ? ")
			.append("      AND CH0191.KNK_MOVE_CD <> '09' ")
			.append("      AND CH0191.KNK_PRC_KMK_CD = '00900082301' ")
			.append("      AND CH0191.RIREKI_DATA_FLG = '1' ")
			.append("      AND CH0191.MK_FLG = '0' ")
			.append("      AND NOT EXISTS( ")
			.append("          SELECT 1 ")
			.append("          FROM CH_T_JUTO CH0201 ")
			.append("          WHERE CH0201.KNK_NO = CH0191.KNK_NO ")
			.append("          AND CH0201.CL_YMD IS NULL ")
			.append("          AND CH0201.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, seikyKeiNo);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			String[] msgKeyList1 = {
					CH0191ETMsg.KNK_NO,
					CH0191ETMsg.GENE_ADD_DTM,
					CH0191ETMsg.KNK_MOVE_CD,
					CH0191ETMsg.SEIKY_KEI_NO,
					CH0191ETMsg.KNK_IDO_YMD,
					CH0191ETMsg.IDOMOTO_KNK_NO,
					CH0191ETMsg.TOGO_KNK_NO,
					CH0191ETMsg.NYUKIN_NO,
					CH0191ETMsg.KNK_PRC_KMK_CD,
					CH0191ETMsg.KNK_AMNT,
					CH0191ETMsg.SSN_WAY_CD,
					CH0191ETMsg.RIREKI_DATA_FLG,
					CH0111ETMsg.NYUKIN_NO,
					CH0111ETMsg.NYUKIN_ROUTE_CD,
					CH0111ETMsg.NYUKIN_TRN_YMD,
					CH0111ETMsg.NYUKIN_TRN_HMS
			};

			// 返却用リスト
			ArrayList<CAANMsg> retArray = new ArrayList<CAANMsg>();

			while (rsltQuery.next())
			{
				CAANMsg rsltMsg = new CAANMsg();
				
				for (int n = 0; n < msgKeyList1.length; n++)
				{
					String key = msgKeyList1[n];
					
					rsltMsg.setPrivate(key, CAANJDBCUtil.getString(rsltQuery, n + 1));
				}
				retArray.add(rsltMsg);
			}
			return retArray.toArray(new CAANMsg[0]);
		}
		catch (SQLException e)
		{
			inCBSMsg.set(CH0191ETMsg.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)
			{
				inCBSMsg.set(CH0191ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
	// v23.00.00 ADD END
}
