/*********************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECK0151C010TPMA
*   ソースファイル名：JECK0151C010TPMA.java
*   作成者          ：富士通
*   日付            ：2011年06月30日
*＜機能概要＞
*   主処理(共通)<BR>
*   指示書エラー回数更新独自処理部品クラス.
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/06/30  富士通      新規作成
*   v32.00.00   2017/05/26  FJ)河邊    【OM-2017-0000488】オープンカーソルエラー
*
**********************************************************************/

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.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.util.JCCFrameworkException;
import eo.ejb.cbm.entity.CK0151ETMsg;
import eo.ejb.cbs.cbsmsg.ECK0151C010CBSMsg;


/**
 * <p>
 * 指示書エラー回数更新独自処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JECK0151C010TPMA implements TemplateMainHandler {

	/**
	 * コンストラクタ.
	 */
	public JECK0151C010TPMA()
	{
		super();
	}

	/**
	 * エラー回数、結果フラグ取得処理.
	 * 入力パラメータのエラー回数が未設定の場合、対象の指示書の現在のエラー回数＋１の値を取得する。
	 * エラー回数が1以上の場合は、結果フラグに1(エラー)をセットする。
	 * エラー回数は0の場合は、結果フラグに0(正常)をセットする。
	 * @param inMsg CAANメッセージ
	 * @param inContext 
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws Exception 
	{
		// エラー回数の取得
		int nextErrCnt = getNextErrCnt(inCBSMsg);

		// エラー回数のセット
		inCBSMsg.set(ECK0151C010CBSMsg.ERR_CNT, new Integer(nextErrCnt).toString());

		// エラー回数に応じた結果フラグを設定
		if (nextErrCnt == 0){
			inCBSMsg.set(ECK0151C010CBSMsg.RSLT_FLG, "0");
		} else {
			inCBSMsg.set(ECK0151C010CBSMsg.RSLT_FLG, "1");
		}
	}
	
	/**
	 * 次のエラー回数を取得する.
	 * 
	 * @param inMsg CAANメッセージ
	 * @return エラー回数
	 */
	private static int getNextErrCnt(CAANMsg inCBSMsg){

		String errCnt  = inCBSMsg.getString(ECK0151C010CBSMsg.ERR_CNT);

		if ((errCnt == null) && ("".equals(errCnt))){
			return new Integer(errCnt).intValue();
		}

		int nextErrCnt = 0;

		// Connection の取得
		Connection con = JSYejbConnection.getConnection(CK0151ETMsg.getTableName());
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try
		{
			// SQL文の組立て
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("   CK0151.ERR_CNT AS ERR_CNT, ")
					.append("   CK0151.RSLT_FLG AS RSLT_FLG ")
					.append(" FROM  CK_T_SJISHO CK0151 ")
					.append(" WHERE CK0151.SJISHO_NO = ? ")
					.append("   AND CK0151.SJISHO_NAIYO_SEQ = ? ");

			pstmt = con.prepareStatement(sql_Buff.toString());
			
			// inCBSMsgから指示書No,枝番を取得して条件に設定
			CAANJDBCUtil.setParam(pstmt, 1, inCBSMsg.getString(ECK0151C010CBSMsg.SJISHO_NO));
			CAANJDBCUtil.setParam(pstmt, 2, inCBSMsg.getString(ECK0151C010CBSMsg.SJISHO_NAIYO_SEQ));

			// SQL実行
			rs = pstmt.executeQuery();
			
			// データが取得できた場合
			if (rs.next())
			{
				// inCBSMsgにエラー回数を設定
				nextErrCnt = rs.getInt("ERR_CNT");
				nextErrCnt = nextErrCnt += 1;
			}
		}
		catch (SQLException e)
		{
				throw new JCCFrameworkException(e);
		}
		finally
		{
			try
			{
				if (rs != null)
				{
					rs.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
// OM-2017-0000488 2017/05/26 ADD START
				if (con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
//OM-2017-0000488 2017/05/26 ADD END
			}
			catch (SQLException se)
			{
				throw new JCCFrameworkException(se);
			}
		}

		return nextErrCnt;
	}
}
