/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JCHejbCH0231SecProc
 *	ソースファイル名：JCHejbCH0231SecProc.java
 *	作成者			：富士通
 *	日付			：2012年10月20日
 *＜機能概要＞
 *	督促に対する副次処理を行う部品
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2012/10/20	富士通		新規作成
 *	v5.00.00    2013/10/26  FJ) 林     【OM-2013-0002588】督促取得処理・督促更新処理を追加。
 *	v6.00.00    2014/01/27  FJ)小野    【OM-2014-0000223】満額入金(入金登録)で督促ステータスが更新されない事象に対応(料金変更では当月請求額がゼロになった場合)。
 *	v9.00.05	2014/07/09	FJ)小野    【OM-2014-0002397】料金変更時の支払約束日情報（督促）更新の不具合を対応。
 *	v11.00.00	2014/12/27	FJ)古田    【OM-2014-0003895】督促異動年月日未設定対応
 **********************************************************************/

package eo.ejb.common.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANFinderException;
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.TemplateSQLEntity;

import eo.ejb.cbm.entity.CH0231ETMsg;
import eo.ejb.cbm.entity.CH0341ETMsg;
import eo.ejb.cbm.entity.CH0341LE;
import eo.ejb.common.JCHModelCommon;
import eo.ejb.common.JPCModelCommon;
/**
 * <p>
 * 督促に対する副次処理を行う部品です。
 * </p>
 * 
 * @author 富士通
 */
public class JCHejbCH0231SecProc  extends TemplateSQLEntity
{
	/**
	 * コンストラクタです。
	 */
	public JCHejbCH0231SecProc() 
	{
		super();
	}

	/**
	 * <p>
	 * 処理名：督促金額更新副次処理
	 * 処理概要：督促の督促金額を更新する。
	 * </p>
	 * 
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inCAANMsg CBSメッセージ(更新対象)
	 */
	public void updateAmnt(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inCAANMsg) {

		try {

			// キー項目を設定
			CAANMsg inETMsg = new CAANMsg(CH0231ETMsg.class.getName());
			inETMsg.set(CH0231ETMsg.TOKUSOKU_NO, inCAANMsg.getString(CH0231ETMsg.TOKUSOKU_NO));

			// 更新項目を設定
			inETMsg.set(CH0231ETMsg.TOKUSOKU_AMNT, inCAANMsg.getString(CH0231ETMsg.TOKUSOKU_AMNT));
			inETMsg.set(CH0231ETMsg.TOKUSOKU_IDO_EVENT_CD, inCAANMsg.getString(CH0231ETMsg.TOKUSOKU_IDO_EVENT_CD));
			inETMsg.set(CH0231ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsg.set(CH0231ETMsg.UPD_OPEACNT, inCAANMsg.getString(CH0231ETMsg.UPD_OPEACNT));
			
			/* ++++++++++ v11.00.00 追加開始 ++++++++++ */
			// 督促テーブルの督促異動年月日を運用日で更新
			inETMsg.set(CH0231ETMsg.TOKUSOKU_IDO_YMD, (String)JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			/* ++++++++++ v11.00.00 追加完了 ++++++++++ */

			// 主キーによる更新。
			super.update(inETMsg);

		} catch (CAANFinderException e) {

			throw new CAANRuntimeException(e);

		} catch (Exception e) {

			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 処理名：督促更新副次処理
	 * 処理概要：督促を更新する。
	 * </p>
	 * 
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inCAANMsg CBSメッセージ(更新対象)
	 */
	public void updateTokusoku(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inCAANMsg) 
	{
		try 
		{
			// キー項目を設定
			CAANMsg inETMsg = new CAANMsg(CH0231ETMsg.class.getName());
			inETMsg.set(CH0231ETMsg.TOKUSOKU_NO, inCAANMsg.getString(CH0231ETMsg.TOKUSOKU_NO));

			// 更新項目を設定
			inETMsg.set(CH0231ETMsg.TOKUSOKU_AMNT, inCAANMsg.getString(CH0231ETMsg.TOKUSOKU_AMNT));
			inETMsg.set(CH0231ETMsg.TOKUSOKU_IDO_EVENT_CD, inCAANMsg.getString(CH0231ETMsg.TOKUSOKU_IDO_EVENT_CD));

			if (!inCAANMsg.isNull(CH0231ETMsg.TOKUSOKU_STAT))
			{
				inETMsg.set(CH0231ETMsg.TOKUSOKU_STAT, inCAANMsg.getString(CH0231ETMsg.TOKUSOKU_STAT));
			}
			if (!inCAANMsg.isNull(CH0231ETMsg.TOKUSOKU_ENDYMD))
			{
				inETMsg.set(CH0231ETMsg.TOKUSOKU_ENDYMD, inCAANMsg.getString(CH0231ETMsg.TOKUSOKU_ENDYMD));
			}

			if (!inCAANMsg.isNull(CH0231ETMsg.PAY_YAKUSOKU_UK_YMD))
			{
				inETMsg.set(CH0231ETMsg.PAY_YAKUSOKU_UK_YMD, inCAANMsg.getString(CH0231ETMsg.PAY_YAKUSOKU_UK_YMD));
			}
			else
			{
				inETMsg.setNull(CH0231ETMsg.PAY_YAKUSOKU_UK_YMD);
			}

			if (!inCAANMsg.isNull(CH0231ETMsg.PAY_YAKUSOKU_YMD))
			{
				inETMsg.set(CH0231ETMsg.PAY_YAKUSOKU_YMD, inCAANMsg.getString(CH0231ETMsg.PAY_YAKUSOKU_YMD));
			}
			else
			{
				inETMsg.setNull(CH0231ETMsg.PAY_YAKUSOKU_YMD);
			}

			if (!inCAANMsg.isNull(CH0231ETMsg.PAY_YAKUSOKU_RIKO_JDG_YMD))
			{
				inETMsg.set(CH0231ETMsg.PAY_YAKUSOKU_RIKO_JDG_YMD, inCAANMsg.getString(CH0231ETMsg.PAY_YAKUSOKU_RIKO_JDG_YMD));
			}
			else
			{
				inETMsg.setNull(CH0231ETMsg.PAY_YAKUSOKU_RIKO_JDG_YMD);
			}
			
			/* ++++++++++ v11.00.00 追加開始 ++++++++++ */
			// 督促テーブルの督促異動年月日を運用日で更新
			inETMsg.set(CH0231ETMsg.TOKUSOKU_IDO_YMD, (String)JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			/* ++++++++++ v11.00.00 追加完了 ++++++++++ */

			inETMsg.set(CH0231ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsg.set(CH0231ETMsg.UPD_OPEACNT, inCBSMsg.getString(CH0231ETMsg.OPERATORID));

			// 主キーによる更新。
			super.update(inETMsg);

		} catch (CAANFinderException e) {

			throw new CAANRuntimeException(e);

		} catch (Exception e) {

			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 督促データを取得する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 */
	public CAANMsg[] getTokusokuInfo(CAANMsg inCBSMsg, AgentDispatchContext inContext, String tokusokuNo, String saikenNo)
	{
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		CAANMsg rsltMsg = new CAANMsg();
		
		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0231ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			
    		sql_Buff.append(" SELECT ")
					.append("      CH0231.TOKUSOKU_NO ")
					.append("     ,CH0231.TOKUSOKU_IDO_EVENT_CD ")
					.append("     ,CH0231.TOKUSOKU_IDO_YMD ")
					.append("     ,CH0231.TOKUSOKU_STAT ")
					.append("     ,CH0231.TOKUSOKU_AMNT ")
					.append("     ,CH0231.PAY_YAKUSOKU_UK_YMD ")
					.append("     ,CH0231.PAY_YAKUSOKU_YMD ")
					.append("     ,CH0231.PAY_YAKUSOKU_RIKO_JDG_YMD ")
					.append("   FROM ")
					.append("      CH_T_TOKUSOKU CH0231 ")
					.append("      INNER JOIN ")
					.append("         CH_T_TOKUSK_SKN_KNRN CH0341 ")
					.append("      ON CH0341.TOKUSOKU_NO = CH0231.TOKUSOKU_NO ")
					.append("  WHERE ")
					.append("        CH0231.TOKUSOKU_NO = ? ")
					.append("    AND CH0231.TOKUSOKU_STAYMD <= ? ")
					.append("    AND CH0231.TOKUSOKU_ENDYMD > ?  ")
					.append("    AND CH0341.SAIKEN_NO = ? ")
					.append("    AND CH0231.MK_FLG = '0' ")
    				.append("    AND CH0341.MK_FLG = '0' ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			String opeDate = (String)JPCModelCommon.getOpeDate(inCBSMsg, inContext, null);
			
			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, 1, tokusokuNo);
			CAANJDBCUtil.setParam(pstmt, 2, opeDate);
			CAANJDBCUtil.setParam(pstmt, 3, opeDate);
			CAANJDBCUtil.setParam(pstmt, 4, saikenNo);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			String[] msgKeyList1 = {
					CH0231ETMsg.TOKUSOKU_NO,
					CH0231ETMsg.TOKUSOKU_IDO_EVENT_CD,
					CH0231ETMsg.TOKUSOKU_IDO_YMD,
					CH0231ETMsg.TOKUSOKU_STAT,
					CH0231ETMsg.TOKUSOKU_AMNT,
					CH0231ETMsg.PAY_YAKUSOKU_UK_YMD,
					CH0231ETMsg.PAY_YAKUSOKU_YMD,
					CH0231ETMsg.PAY_YAKUSOKU_RIKO_JDG_YMD
			};

			// 返却用リスト
			ArrayList<CAANMsg> retArray = new ArrayList<CAANMsg>();

			while (rsltQuery.next())
			{
				CAANMsg retMsg = new CAANMsg(CH0231ETMsg.class.getName());
				for (int n = 0; n < msgKeyList1.length; n++)
				{
					String key = msgKeyList1[n];
					
					rsltMsg.setPrivate(key, CAANJDBCUtil.getString(rsltQuery, n + 1));
				}
				retArray.add(retMsg);
			}
			return retArray.toArray(new CAANMsg[0]);
		}
		catch (SQLException e)
		{
			inCBSMsg.set(CH0231ETMsg.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(CH0231ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	/**
	 * <p>
	 * 督促債権関連取得処理。
	 * 主キーである督促番号、債権番号により一意検索を行う。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param tokusokuNo 督促番号
	 * @param saikenNo 債権番号
	 * @return 取得した債権テーブルの情報（データが取得できない場合、nullを返す）。
	 */
	public CAANMsg getTkskSknKnrn(CAANMsg inCBSMsg, AgentDispatchContext inContext, String tokusokuNo, String saikenNo)
	{
		CAANMsg inCH0341 = new CAANMsg(CH0341ETMsg.class.getName());

		// 検索条件を設定
		inCH0341.set(CH0341ETMsg.TOKUSOKU_NO, tokusokuNo);
		inCH0341.set(CH0341ETMsg.SAIKEN_NO, saikenNo);
		inCH0341.set(CH0341ETMsg.MK_FLG, "0");

		CH0341LE le = new CH0341LE();
		CAANMsg result = null;
		result = le.findByPrimaryKey(inCH0341);

		return result;
	}

	/**
     * このエンティティのスキーマの内容を取得します。<br>
     * 業務レベルで実装します。
     * @return スキーマのContents
     */
	@Override
	protected Object[][] getSchemaContents()
	{
		return CH0231ETMsg.getSchemaContents();
	}

    /**
     * このエンティティのスキーマの名を取得します。<br>
     * 業務レベルで実装します。
     * @return スキーマ名
     */
	@Override
	protected String getSchemaName()
	{
		return CH0231ETMsg.class.getName();
	}

    /**
     * このエンティティの参照するテーブル名を取得します。<br>
     * 業務レベルで実装します。
     * @return テーブル名
     */
	@Override
	protected String getTableName()
	{
		return CH0231ETMsg.getTableName();
	}
}
