/*********************************************************************
*	All Rights reserved,Copyright c Fujitsu, 2011
**********************************************************************
*＜プログラム内容＞
*	システム名		：プロジェクト共通
*	モジュール名	：JCHejbCH0191KnkMoveCdEdit
*	ソースファイル名：JCHejbCH0191KnkMoveCdEdit.java
*	作成者			：富士通
*	日付			：2011年08月11日
*＜機能概要＞
*	金庫移動登録時の金庫移動コードを編集する部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/11	富士通		新規作成
*
**********************************************************************/
package eo.ejb.common.edit;

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.common.constant.JACStrConst;
import eo.ejb.cbm.entity.CH0021ETMsg;
import eo.ejb.cbm.entity.CH0401ETMsg;
import eo.ejb.cbs.cbsmsg.ECH0011C013CBSMsg;
import eo.ejb.cbs.mainproc.JECH0011C013TPMA;
import eo.ejb.common.JPCModelCommon;


/**
 * 債権ステータスを編集する部品<p>
 * <br>
 * @author 富士通
 */
public class JCHejbCH0011SaikenStateEdit
{
	/**
	 * 債権ステータス編集処理<br>
	 * 債権ステータスを算出し返却する。
	 * <br>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 編集結果
	 */
	public static String getSaikenStateEdit(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String strSaikenState = null;
		
		String sPRC_GRP_CD = null;
		String sPCRS_CD = null;
		String sPRC_SVC_CD = null;
		String sPRC_KMK_CD = null;

		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt1 = null;
		PreparedStatement pstmt2 = null;
		PreparedStatement pstmt3 = null;
		PreparedStatement pstmt4 = null;

		// リザルトセット
		ResultSet rsltQuery1 = null;
		ResultSet rsltQuery2 = null;
		ResultSet rsltQuery3 = null;
		ResultSet rsltQuery4 = null;
		/********************
		 * SQL文の作成
		 ********************/


		try {

			// コネクション取得
			con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());

			// -------------------------------------------------- //
			// 未収金額取得
			// -------------------------------------------------- //
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("  CH0401.PRC_GRP_CD ")
					.append(" ,CH0401.PCRS_CD ")
					.append(" ,CH0401.PRC_SVC_CD ")
					.append(" ,CH0401.PRC_KMK_CD ")
					.append(" FROM ")
					.append("  CH_M_PRC_KMK_CS_CHGE CH0401 ")
					.append(" WHERE ")
					.append("      CH0401.SYS_CD = 'CH' ")
					.append("  AND CH0401.WORK_KINO_SKBT_CD = ?")
					.append("  AND CH0401.PRC_KMK_CS_CHGE_TSTAYMD <= ? ")
					.append("  AND CH0401.PRC_KMK_CS_CHGE_TENDYMD >= ? ")
					.append("  AND CH0401.MK_FLG = '0' ");

			// prepareStatementにSQL文をセット
			pstmt1 = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
					JECH0011C013TPMA.class, sql_Buff);

			int i = 1;
			
			CAANJDBCUtil.setParam(pstmt1, i++, inCBSMsg.getString(ECH0011C013CBSMsg.MISY_APL_KINO_CD));
			CAANJDBCUtil.setParam(pstmt1, i++, JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			CAANJDBCUtil.setParam(pstmt1, i++, JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			
			// ResultSetの取得
			rsltQuery1 = pstmt1.executeQuery();

			// 戻り値の判定
			if (rsltQuery1.next()) {
				// 料金グループコードを取得する。
				sPRC_GRP_CD = rsltQuery1.getString(CH0401ETMsg.PRC_GRP_CD);
				// 料金コースコードを取得する
				sPCRS_CD = rsltQuery1.getString(CH0401ETMsg.PCRS_CD);
				// 料金サービスコードを取得する
				sPRC_SVC_CD = rsltQuery1.getString(CH0401ETMsg.PRC_SVC_CD);
				// 料金項目コードを取得する
				sPRC_KMK_CD = rsltQuery1.getString(CH0401ETMsg.PRC_KMK_CD);
			}
			
			StringBuffer sql_Buff2 = new StringBuffer();
			sql_Buff2
					.append(" SELECT ")
					.append("  CH0021.AMNT ")
					.append(" FROM ")
					.append("  CH_T_SAIKEN_UCWK CH0021 ")
					.append(" WHERE ")
					.append("      CH0021.SAIKEN_NO = ? ")
					.append("  AND CH0021.PRC_GRP_CD = ? " )
					.append("  AND CH0021.PCRS_CD = ? " )
					.append("  AND CH0021.PRC_SVC_CD = ? " )
					.append("  AND CH0021.PRC_KMK_CD = ? " )
					.append("  AND CH0021.MK_FLG = '0' ");

			// prepareStatementにSQL文をセット
			pstmt2 = con1.prepareStatement(sql_Buff2.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,JECH0011C013TPMA.class, sql_Buff2);

			i = 1;
			
			CAANJDBCUtil.setParam(pstmt2, i++, inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_NO));
			CAANJDBCUtil.setParam(pstmt2, i++, sPRC_GRP_CD);
			CAANJDBCUtil.setParam(pstmt2, i++, sPCRS_CD);
			CAANJDBCUtil.setParam(pstmt2, i++, sPRC_SVC_CD);
			CAANJDBCUtil.setParam(pstmt2, i++, sPRC_KMK_CD);
			
			// ResultSetの取得
			rsltQuery2 = pstmt2.executeQuery();

			// 戻り値の判定
			long mishuAmnt = 0L;
			if (rsltQuery2.next()) {
				mishuAmnt = Long.valueOf(rsltQuery2.getString(CH0021ETMsg.AMNT));
			}

			// -------------------------------------------------- //
			// 充当金額取得
			// -------------------------------------------------- //
			// prepareStatementにSQL文をセット
			pstmt3 = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
					JECH0011C013TPMA.class, sql_Buff);

			i = 1;

			CAANJDBCUtil.setParam(pstmt3, i++, inCBSMsg.getString(ECH0011C013CBSMsg.JUTO_APL_KINO_CD));
			CAANJDBCUtil.setParam(pstmt3, i++, JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			CAANJDBCUtil.setParam(pstmt3, i++, JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			
			// ResultSetの取得
			rsltQuery3 = pstmt3.executeQuery();

			// 戻り値の判定
			if (rsltQuery3.next()) {
				// 料金グループコードを取得する。
				sPRC_GRP_CD = rsltQuery3.getString(CH0401ETMsg.PRC_GRP_CD);
				// 料金コースコードを取得する
				sPCRS_CD = rsltQuery3.getString(CH0401ETMsg.PCRS_CD);
				// 料金サービスコードを取得する
				sPRC_SVC_CD = rsltQuery3.getString(CH0401ETMsg.PRC_SVC_CD);
				// 料金項目コードを取得する
				sPRC_KMK_CD = rsltQuery3.getString(CH0401ETMsg.PRC_KMK_CD);
			}

			// prepareStatementにSQL文をセット
			pstmt4 = con1.prepareStatement(sql_Buff2.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,JECH0011C013TPMA.class, sql_Buff2);

			i = 1;
			
			CAANJDBCUtil.setParam(pstmt4, i++, inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_NO));
			CAANJDBCUtil.setParam(pstmt4, i++, sPRC_GRP_CD);
			CAANJDBCUtil.setParam(pstmt4, i++, sPCRS_CD);
			CAANJDBCUtil.setParam(pstmt4, i++, sPRC_SVC_CD);
			CAANJDBCUtil.setParam(pstmt4, i++, sPRC_KMK_CD);
			
			// ResultSetの取得
			rsltQuery4 = pstmt4.executeQuery();

			// 戻り値の判定
			long jutoAmnt = 0L;
			if (rsltQuery4.next()) {
				jutoAmnt = Long.valueOf(rsltQuery4.getString(CH0021ETMsg.AMNT));
			}

			// 戻り値の判定
			if (mishuAmnt == 0)
			{
				// 未収額が0だった場合「050:収納済」を返却
				strSaikenState = JACStrConst.SAIKEN_STAT_KAKNO_ZUMI;
			}
			else if (jutoAmnt == 0)
			{
				// 充当額が0だった場合「020:請求確定」を返却
				strSaikenState = JACStrConst.SAIKEN_STAT_FIX_SEIKY;
			}
			else
			{
				// それ以外の場合「060:一部収納」を返却
				strSaikenState = JACStrConst.SAIKEN_STAT_ICHIBU_KAKNO;
			}

		} catch (SQLException e) {
			inCBSMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try {
				if (rsltQuery1 != null) {
					rsltQuery1.close();
				}
				if (rsltQuery2 != null) {
					rsltQuery2.close();
				}
				if (rsltQuery3 != null) {
					rsltQuery3.close();
				}
				if (rsltQuery4 != null) {
					rsltQuery4.close();
				}
				if (pstmt1 != null) {
					pstmt1.close();
				}
				if (pstmt2 != null) {
					pstmt2.close();
				}
				if (pstmt3 != null) {
					pstmt3.close();
				}
				if (pstmt4 != null) {
					pstmt4.close();
				}
				if (con1 != null) {
					CAANConnectionMgr.getInstance().close(con1);
				}
			} catch (SQLException e) {
				inCBSMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		return strSaikenState;
	}

}
