/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECH0191C030TPMA
*   ソースファイル名：JECH0191C030TPMA.java
*   作成者          ：富士通
*   日付            ：2011年08月02日
*＜機能概要＞
*   金庫統合顧客独自処理部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/11/15  富士通      新規作成
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

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 com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.util.JCRUtilCommon;
import eo.ejb.cbm.entity.CH0391ETMsg;
import eo.ejb.cbm.entity.CH0401ETMsg;
import eo.ejb.cbm.entity.ZM0171ETMsg;
import eo.ejb.cbs.cbsmsg.ECH0191C030CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0191C030CBSMsg1List;
import eo.ejb.common.JPCModelCommon;

/**
 * <p>
 * 金庫統合時に金庫番号の採番とCBSMSGの設定を行う部品
 * </p>
 * @author 富士通
 */
public class JECH0191C030TPMA implements TemplateMainHandler {

	/**
	 * コンストラクタです。
	 */
	public JECH0191C030TPMA()
	{
		super();
	}

	/**
	 * <p>
	 * CBSMSGの設定を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public static void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{

		//----------------------------------------------------
		// CBSMSG設定処理
		//----------------------------------------------------
		// 統合対象金庫情報一覧を作成する。
		CAANMsg[] caECH0191C030CBSMsg1LIST = inCBSMsg.getCAANMsgList(ECH0191C030CBSMsg.ECH0191C030CBSMSG1LIST);
		
		// 取得件数
		int igetCount = caECH0191C030CBSMsg1LIST.length;
		
		//統合金庫情報
		//出力＿金庫料金項目コードにCBSMsgの「金庫料金項目コード」を設定する。
		inCBSMsg.set(ECH0191C030CBSMsg.OUT_KNK_PRC_KMK_CD, inCBSMsg.getString(ECH0191C030CBSMsg.KNK_PRC_KMK_CD));
		
		//出力＿金庫料金項目コード名称にCBSMsgの「金庫料金項目コードの名称」を設定する。
		inCBSMsg.set(ECH0191C030CBSMsg.OUT_KNK_PRC_KMK_CD_NM, getOutKnkPrcKmkCdNm(inCBSMsg,inContext));
		
		
		//----------------------------------------------------
		// 最古の入金処理年月日を取得する
		//----------------------------------------------------
		
		//最古の入金処理年月日を設定
		String minNyukinTrnYMD = null;

		//最古の入金処理年月日が入っているデータが明細の何番目のデータかを判定するために使用
		int minDataNum = 0;
		
		//明細の中で最古の統合対象＿入金処理年月日をMinNyukinTrnYMDに設定する。
		for(int n = 0; n < igetCount; n++)
		{
			if (JCRUtilCommon.isNull(minNyukinTrnYMD))
			{
				minNyukinTrnYMD = caECH0191C030CBSMsg1LIST[n].getString(ECH0191C030CBSMsg1List.TG_NYUKIN_TRN_YMD);
				minDataNum = n;
			}
			else
			{
				String sNyukinTrnYMD = caECH0191C030CBSMsg1LIST[n].getString(ECH0191C030CBSMsg1List.TG_NYUKIN_TRN_YMD);
				if (!JCRUtilCommon.isNull(sNyukinTrnYMD))
				{
					if(minNyukinTrnYMD.compareTo(sNyukinTrnYMD) > 0)
					{
						minNyukinTrnYMD = caECH0191C030CBSMsg1LIST[n].getString(ECH0191C030CBSMsg1List.TG_NYUKIN_TRN_YMD);
						minDataNum = n;
					}
				}
			}
		}
		
		// 統合対象＿入金経路コード
		String tgNyukinRouteCD = "";
		// 統合対象＿入金番号
		String tgNyukinNo = "";
		
		if (!JCRUtilCommon.isNull(minNyukinTrnYMD))
		{
			tgNyukinRouteCD = caECH0191C030CBSMsg1LIST[minDataNum].getString(ECH0191C030CBSMsg1List.TG_NYUKIN_ROUTE_CD);
			tgNyukinNo = caECH0191C030CBSMsg1LIST[minDataNum].getString(ECH0191C030CBSMsg1List.TG_NYUKIN_NO);
		}
		
		//出力＿入金処理年月日にCBSMsg1Listの統合対象金庫情報明細の中で入金処理年月日が最古の「統合対象＿入金処理年月日」を設定する。
		inCBSMsg.set(ECH0191C030CBSMsg.OUT_NYUKIN_TRN_YMD, minNyukinTrnYMD);
		
		//出力＿入金経路コードにCBSMsg1Listの統合対象金庫情報明細の中で入金処理年月日が最古の「統合対象＿入金経路コード」を設定する。
		inCBSMsg.set(ECH0191C030CBSMsg.OUT_NYUKIN_ROUTE_CD, tgNyukinRouteCD);
		
		//出力＿入金経路コード名称にCBSMsgの「入金経路コードの名称」を設定する。
		inCBSMsg.set(ECH0191C030CBSMsg.OUT_NYUKIN_ROUTE_CD_NM, getOutNyukinRouteCdNm(inCBSMsg,inContext));
		
		//入金番号にCBSMsg1Listの統合対象金庫情報明細の中で入金処理年月日が最古の「統合対象＿入金番号」を設定する。
		inCBSMsg.set(ECH0191C030CBSMsg.NYUKIN_NO, tgNyukinNo);
		
		//金庫金額にCBSMsg1Listの統合対象金庫情報明細の「統合対象＿金庫金額」を全て合計したものを設定する。
		inCBSMsg.set(ECH0191C030CBSMsg.KNK_AMNT, getTotalKnkAmnt(inCBSMsg,inContext,caECH0191C030CBSMsg1LIST));
		
		//出力＿金庫金額にCBSMsg1Listの統合対象金庫情報明細の「統合対象＿金庫金額」を全て合計したものを設定する。
		inCBSMsg.set(ECH0191C030CBSMsg.OUT_KNK_AMNT, getTotalKnkAmnt(inCBSMsg,inContext,caECH0191C030CBSMsg1LIST));
		
	}
	/**
	 * <p>
	 * 出力＿入金経路コード名称を取得する
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 入金経路コード名称
	 */
	public static String getOutNyukinRouteCdNm(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
	
		
		/******************** 
		 * SQL文の作成
		 ********************/
		try
		{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append(" ZM0171.CD_DIV_NM ")
					.append(" FROM ")
					.append("  ZM_M_CD_NM_KANRI ZM0171 ")
					.append(" WHERE ")
					.append("      ZM0171.CD_SBT_CD = 'CD00176' ")
					.append("  AND ZM0171.CD_DIV = ? ")
					.append("  AND ZM0171.CD_TSTAYMD <= ? ")
					.append("  AND ZM0171.CD_TENDYMD >= ? ")
					.append("  AND ZM0171.MK_FLG = '0' ");
			
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
					JECH0191C030TPMA.class, sql_Buff);
			
			int i = 1;
			
			// パラメータの設定(出力＿入金経路コードを指定)
			CAANJDBCUtil.setParam(pstmt, i++, inCBSMsg.getString(ECH0191C030CBSMsg.OUT_NYUKIN_ROUTE_CD));
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 戻り値の判定
			
			// コード区分名
			String sCD_DIV_NM = null;
			
			if (rsltQuery.next())
			{
				// コード区分名を取得する
				sCD_DIV_NM = rsltQuery.getString(ZM0171ETMsg.CD_DIV_NM);
			}
			
			//戻り値に入金経路コード名称を設定する。
			return sCD_DIV_NM;
		}
		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);
			}
		}
	}
	/**
	 * <p>
	 * 出力＿金庫料金項目コード名称を取得する
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 料金項目コード名称
	 */
	public static String getOutKnkPrcKmkCdNm(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{

		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
	
		
		/******************** 
		 * SQL文の作成
		 ********************/
		try
		{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append(" CH0391.PRC_KMK_NM ")
					.append(" FROM ")
					.append("  CH_M_PRC_KMK_OPUT_NM CH0391 ")
					.append(" WHERE ")
					.append("      CH0391.PRC_KMK_NM_SBT_CD = '1' ")
					.append("  AND CH0391.PRC_KMK_CD = ? ")
					.append("  AND CH0391.PRC_GRP_CD = '  ' ")
					.append("  AND CH0391.PCRS_CD = '   ' ")
					.append("  AND CH0391.PRC_SVC_CD = '            ' ")
					.append("  AND CH0391.PRC_KMK_OPUT_NM_TSTAYMD <= ? ")
					.append("  AND CH0391.PRC_KMK_OPUT_NM_TENDYMD >= ? ")
					.append("  AND CH0391.MK_FLG = '0' ");
			
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
					JECH0191C030TPMA.class, sql_Buff);
			
			int i = 1;
			
			// パラメータの設定(金庫料金項目コードを指定)
			CAANJDBCUtil.setParam(pstmt, i++, inCBSMsg.getString(ECH0191C030CBSMsg.KNK_PRC_KMK_CD));
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 戻り値の判定
			
			// 料金項目コード名称
			String sPRC_KMK_NM = null;
			
			if (rsltQuery.next())
			{
				// 料金項目コード名称を取得する
				sPRC_KMK_NM = rsltQuery.getString(CH0391ETMsg.PRC_KMK_NM);
			}
			
			//戻り値に料金項目コード名称を設定する。
			return sPRC_KMK_NM;
		}
		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);
			}
		}
	}
	/**
	 * <p>
	 * 合計金庫金額を取得する
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 合計金庫金額
	 */
	public static String getTotalKnkAmnt(CAANMsg inCBSMsg, AgentDispatchContext inContext,CAANMsg[] caECH0191C030CBSMsg1LIST)
	{
		
		//合計金庫金額
		int totalKnkAmnt = 0;

		//合計金庫金額にCBSMsg1Listの統合対象金庫情報明細の「統合対象＿金庫金額」を全て合計したものを設定する。
		for(int n = 0; n < caECH0191C030CBSMsg1LIST.length; n++){
			totalKnkAmnt = totalKnkAmnt + Integer.valueOf(caECH0191C030CBSMsg1LIST[n].getString(ECH0191C030CBSMsg1List.TG_KNK_AMNT));
		}
		return String.valueOf(totalKnkAmnt);
	}
}
