/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECH0191B012TPMA
*   ソースファイル名：JECH0191B012TPMA.java
*   作成者          ：富士通
*   日付            ：2011年08月12日
*＜機能概要＞
*   金庫移動登録顧客独自処理部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/08/12  富士通      新規作成
*
**********************************************************************/

package eo.ejb.cbs.mainproc;


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 com.fujitsu.futurity.model.ejb.common.fw.EntityMainHandler;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import eo.ejb.cbm.entity.CH0191ETMsg;
import eo.ejb.cbs.cbsmsg.ECH0191B011CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0191B012CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0191B012CBSMsg1List;


/**
 * <p>
 * 移動金庫一覧照会時に副次処理を呼び出す部品
 * および、移動金庫一覧照会時に副次処理を呼び出す部品
 * </p>
 * @author 富士通
 */
public class JECH0191B012TPMA implements TemplateMainHandler, EntityMainHandler{
	
	/**
	 * コンストラクタです。
	 */
	public JECH0191B012TPMA()
	{
		super();
	}

	/**
	 * <p>
	 * 移動金庫一覧照会を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		// パラメータインデックス
		int i = 1;
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0191ETMsg.getTableName());
			
			
			//移動元金庫番号と統合先金庫番号を取得する。
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append(" 	 CH0191.IDOMOTO_KNK_NO ")
					.append(" 	,CH0191.TOGO_KNK_NO ")
					.append(" FROM CH_T_KNK CH0191 ")
					.append(" WHERE	CH0191.KNK_NO = ? ")
					.append(" AND		CH0191.GENE_ADD_DTM = ")
					.append(" 		(SELECT MAX(CH0191_GENE.GENE_ADD_DTM) AS CH0191_MAX ")
					.append(" 		 FROM	CH_T_KNK CH0191_GENE ")
					.append(" 		 WHERE	CH0191_GENE.KNK_NO = CH0191.KNK_NO ")
					.append(" 		 AND	CH0191_GENE.MK_FLG = '0') ")
					.append(" AND		CH0191.MK_FLG = '0' ");

			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			// パラメータの設定(ＫＥＹ＿金庫番号を指定)
			CAANJDBCUtil.setParam(pstmt, i++, inMsg.getObject(ECH0191B012CBSMsg.KEY_KNK_NO));
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			ArrayList<CAANMsg> rsltMsgList = new ArrayList<CAANMsg>();
			
			// ECH0191B012CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
						  ECH0191B012CBSMsg1List.IDOMOTO_KNK_NO
						, ECH0191B012CBSMsg1List.TOGO_KNK_NO
			};
			
			// 結果を明細にセットする。
			while(rsltQuery.next()){
				CAANMsg rsltMsg = new CAANMsg("eo.ejb.cbs.cbsmsg.ECH0191B012CBSMsg1List");
				
				for(int n = 0; n < msgKeyList1.length; n++){
					
					String key = msgKeyList1[n];
					
					rsltMsg.set(key, CAANJDBCUtil.getString(rsltQuery, n+1));
				}
				
				rsltMsgList.add(rsltMsg);
			}
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = (CAANMsg[])rsltMsgList.toArray(new CAANMsg[0]);
			
			// ****** 存在チェック処理 ******
			// エラーフラグ
			String errFlag = "EA";
			
			// 該当データが存在しない場合、'ＫＥＹ＿金庫番号'にエラーフラグ'EA'を返却する。
			if (0 == outMsg1.length) {
				inMsg.set(ECH0191B012CBSMsg.KEY_KNK_NO_ERR, errFlag);
				inMsg.set(ECH0191B012CBSMsg.STATUS, StatusCodes.RELATION_ERR);
				return;
			}
			
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECH0191B012CBSMsg1List", outMsg1);
			
		} catch(SQLException e) {
			inMsg.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){
					//closeConnection(con1);
					CAANConnectionMgr.getInstance().close(con1);
				}
			}catch(SQLException e){
				inMsg.set(ECH0191B012CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}
