/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCHejbCH0361NumberParts
*	ソースファイル名：JCHejbCH0361NumberParts.java
*	作成者			：富士通
*	日付			：2011年11月17日
*＜機能概要＞
*	督促異動番号採番部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/11/17	富士通		新規作成
*	v5.00.00	2013/11/16	FJ) 早崎	【OM-2013-0004269】バッチ処理より呼び出された場合の機能コード対応
**********************************************************************/

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.common.JCMConstants;
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.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.CH0361ETMsg;
import eo.ejb.cbs.cbsmsg.ECH0361D010CBSMsg;

/**
 * <p>
 * 督促異動の採番部品。
 * </p>
 * @author 富士通
 */
public class JCHejbCH0361NumberParts extends JCHejbNumberPartsBase
{

	/**
	 * コンストラクタです。
	 */
	public JCHejbCH0361NumberParts()
	{
	}

	/**
	 * <p>
	 * 督促異動の督促異動枝番を採番する。
	 * このメソッドは督促異動登録SIFから呼ばれる事を想定される採番部品である。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番された督促異動番号
	 */
	public static String getTkskIdoAddSeqNo(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 督促異動番号
		String value = null;
		// 督促異動番号(数値)
		Long longMaxTkskIdoSeq = 1l;
		
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		con1 = JSYejbConnection.getConnection("CH_T_TOKUSOKU_IDO");

		// リザルトセット
		ResultSet rsltQuery = null;
		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}
		

		try {
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("MAX(CH0361.TOKUSOKU_IDO_NO) AS TOKUSOKU_IDO_NO ")
					.append(" FROM ")
					.append(" CH_T_TOKUSOKU_IDO CH0361 ")
			// 条件
					.append(" WHERE CH0361.TOKUSOKU_NO = ? ");
			
			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			// パラメータの設定(督促番号を指定)
			CAANJDBCUtil.setParam(pstmt , 1 , inMsg.getObject(ECH0361D010CBSMsg.TOKUSOKU_NO));
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 督促異動枝番を設定する
			if (!rsltQuery.next() || null == rsltQuery.getString(CH0361ETMsg.TOKUSOKU_IDO_NO)) 
			{
				// レコードが取得できなかった。または、督促異動番号が存在しなければ1から採番する
				value = String.format("%1$012d", longMaxTkskIdoSeq);
			} 
			else
			{
				// 取得した値をLong型に変換
				longMaxTkskIdoSeq = Long.parseLong(rsltQuery.getString(CH0361ETMsg.TOKUSOKU_IDO_NO));
				// 最大の督促異動枝番に+1を行う。
				longMaxTkskIdoSeq++;
				
				// 左0パディングする
				value = String.format("%1$012d", longMaxTkskIdoSeq);
			}
		} catch (SQLException e) {
			inMsg.set(ECH0361D010CBSMsg.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){
				inMsg.set(ECH0361D010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		
		}
		
		return value;
	}

	/**
	 * <p>
	 * 督促異動の督促異動枝番を採番する。
	 * このメソッドは督促異動登録SIFからの呼び出しに特化せず汎用的に呼ばれる事を想定される採番部品である。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param tokusokuNo 督促番号
	 * @return 採番された督促異動番号
	 */
	public static String getTkskIdoAddSeqNo(CAANMsg inMsg, AgentDispatchContext inContext, String tokusokuNo)
	{
		// 督促異動番号
		String value = null;
		// 督促異動番号(数値)
		Long longMaxTkskIdoSeq = 1l;
		
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		con1 = JSYejbConnection.getConnection("CH_T_TOKUSOKU_IDO");

		// リザルトセット
		ResultSet rsltQuery = null;
		
		// 機能コードのチェック（チェックモードの場合は採番しない）
		String funcCd = inMsg.getString(JCMConstants.FUNC_CODE_KEY);
		
		if ("2".equals(funcCd))
		{
			return null;
		}
		

		try {
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("MAX(CH0361.TOKUSOKU_IDO_NO) AS TOKUSOKU_IDO_NO ")
					.append(" FROM ")
					.append(" CH_T_TOKUSOKU_IDO CH0361 ")
			// 条件
					.append(" WHERE CH0361.TOKUSOKU_NO = ? ");
			
			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			// パラメータの設定(督促番号を指定)
			CAANJDBCUtil.setParam(pstmt , 1 , tokusokuNo);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 督促異動枝番を設定する
			if (!rsltQuery.next() || null == rsltQuery.getString(CH0361ETMsg.TOKUSOKU_IDO_NO)) 
			{
				// レコードが取得できなかった。または、督促異動番号が存在しなければ1から採番する
				value = String.format("%1$012d", longMaxTkskIdoSeq);
			} 
			else
			{
				// 取得した値をLong型に変換
				longMaxTkskIdoSeq = Long.parseLong(rsltQuery.getString(CH0361ETMsg.TOKUSOKU_IDO_NO));
				// 最大の督促異動枝番に+1を行う。
				longMaxTkskIdoSeq++;
				
				// 左0パディングする
				value = String.format("%1$012d", longMaxTkskIdoSeq);
			}
		} catch (SQLException e) {
			inMsg.set(ECH0361D010CBSMsg.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){
				inMsg.set(ECH0361D010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		
		}
		
		return value;
	}

}
