/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK0401Edit
*	ソースファイル名：JKKejbKK0401Edit.java
*	作成者			：富士通
*	日付			：2011年06月24日
*＜機能概要＞
*	サブオプションサービス契約世代登録年月日時分秒取得部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/24	富士通		新規作成
*	v4.00.00	2013/02/16	FJ）藤本	ST3-2013-0000390
*   v4.00.01    2013/03/25  FJ）寺園    IT1-2013-0000593
*   v4.00.02    2013/04/02  FJ）寺園    ST2-2013-0001542
*   v5.00.00    2013/10/12  FJ）小島    OM-2013-0002972
*   v5.00.01    2013/10/31  FJ）寺園    OM-2013-0003686
*   v8.00.00	2014/03/24	FJ）松枝	OM-2014-0000286   
*
**********************************************************************/

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.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0411ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0411C010CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0401DBABase;
import eo.ejb.common.db.JKKejbKK0411DBABase;

/**
 * <p>
 * サブオプションサービス契約世代登録年月日時分秒取得部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0401Edit extends JKKejbKK0401DBABase
{

	/** 年月日：最大値 */
	private static final String YMD_MAX = "20991231";

	/**
	 * コンストラクタです。
	 */
	public JKKejbKK0401Edit()
	{
	}

	/**
	 * <p>
	 * サブオプションサービス契約のカレントレコードの世代登録年月日時分秒を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcKeiNo サブオプションサービス契約番号
	 * @return 指定されたサブオプションサービス契約番号に紐付くカレントレコードの世代登録年月日時分秒
	 */
	public Object getCurrentGeneAddDtm(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object sbopSvcKeiNo)
	{
		// カレント検索用のサブオプションサービス契約の内部スキーマメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 作成したメッセージを使用してカレント検索を行う
		CAANMsg otETMsg = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == otETMsg)
		{
			return null;
		}

		return otETMsg.getString(KK0401ETMsg.GENE_ADD_DTM);
	}

	/**
	 * <p>
	 * 年月日取得(追加容量変更)処理
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcKeiNo サブオプションサービス契約番号
	 * @param addCapa 追加容量
	 * @param ymdKbn 1:プラン開始年月日、2:プラン終了年月日、3:プラン課金開始年月日、4:プラン課金終了年月日
	 * @return 各設定値
	 */
	public String getYmdAddCapa(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object sbopSvcKeiNo, Object addCapa, Object ymdKbn)
	{
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// 追加容量変更判定
		if (chgAddCapa(inMsg, inContext, opSvcKeiNo, sbopSvcKeiNo, addCapa))
		{
			// 1:プラン開始年月日の場合
			if ("1".equals(ymdKbn))
			{
				return opeDate;
			}
			// 3:プラン課金開始年月日の場合
			else if ("3".equals(ymdKbn))
			{
				return this.jdgPlanChrgStaYmd(inMsg);
			}
			// 2:プラン終了年月日または、4:プラン課金終了年月日の場合
			else if ("2".equals(ymdKbn) || "4".equals(ymdKbn))
			{
				return YMD_MAX;
			}
		}
		else
		{
			// カレント検索用メッセージの作成
			CAANMsg inETMsgKK0401 = new CAANMsg(KK0401ETMsg.class.getName());
			inETMsgKK0401.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
			inETMsgKK0401.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
			inETMsgKK0401.set(KK0401ETMsg.RSV_APLY_YMD, opeDate);

			// サブオプションサービス契約のカレント検索
			CAANMsg ret0401 = new JKKejbKK0401DBABase().findByCurrent(inETMsgKK0401);

			// 取得できない場合
			if (null == ret0401)
			{
				return null;
			}

			// 1:プラン開始年月日の場合
			if ("1".equals(ymdKbn))
			{
				return ret0401.getString(KK0401ETMsg.PLAN_STAYMD);
			}
			// 2:プラン終了年月日の場合
			else if ("2".equals(ymdKbn))
			{
				return ret0401.getString(KK0401ETMsg.PLAN_ENDYMD);
			}
			// 3:プラン課金開始年月日の場合
			else if ("3".equals(ymdKbn))
			{
				return ret0401.getString(KK0401ETMsg.PLAN_CHRG_STAYMD);
			}
			// 4:プラン課金終了年月日の場合
			else if ("4".equals(ymdKbn))
			{
				return ret0401.getString(KK0401ETMsg.PLAN_CHRG_ENDYMD);
			}
		}
		return null;
	}

	/**
	 * <p>
	 * 追加容量変更判定
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcKeiNo サブオプションサービス契約番号
	 * @param addCapa 追加容量
	 * @return 追加容量が変更される場合、true
	 */
	public boolean chgAddCapa(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object sbopSvcKeiNo, Object addCapa)
	{

		// 入力値.追加容量が未設定の場合
		if (null == addCapa || "".equals(addCapa))
		{
			return false;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0411 = new CAANMsg(KK0411ETMsg.class.getName());
		inETMsgKK0411.set(KK0411ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0411.set(KK0411ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);

		CAANMsg ret0411 = new JKKejbKK0411DBABase().findByCurrent(inETMsgKK0411);

		// 取得できない場合
		if (null == ret0411)
		{
			return false;
		}

		String crtAddCapa = ret0411.getString(KK0411ETMsg.ADD_CAPA);

		// 入力値.追加容量＝カレントレコード.追加容量の場合
		if (addCapa.equals(crtAddCapa))
		{
			return false;
		}

		return true;
	}
	
	/**
	 * <p>
	 * プラン課金開始年月日に設定する年月日を判定する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return 運用日 or カレント引継
	 */
	private String jdgPlanChrgStaYmd(CAANMsg inMsg)
	{
		// 運用日付を取得する
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0401 = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsgKK0401.set(KK0401ETMsg.OP_SVC_KEI_NO, inMsg.getString(EKK0411C010CBSMsg.OP_SVC_KEI_NO));
		inETMsgKK0401.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inMsg.getString(EKK0411C010CBSMsg.SBOP_SVC_KEI_NO));
		inETMsgKK0401.set(KK0401ETMsg.RSV_APLY_YMD, opeDate);

		// オプションサービス契約のカレント検索を行う
		CAANMsg retKK0401 = new JKKejbKK0401DBABase().findByCurrent(inETMsgKK0401);

		// 検索結果がnullだった場合
		if (retKK0401 == null)
		{
			return null;
		}

		// サービス課金開始年月日が未設定の場合は運用日付を返却する
		if (retKK0401.isNull(KK0401ETMsg.SVC_CHRG_STAYMD))
		{
			return opeDate;
		}

		// カレントのサービス課金開始年月日が運用日付より未来日の場合
		if (JKKModelCommon.isFutureDate(retKK0401.getString(KK0401ETMsg.SVC_CHRG_STAYMD), opeDate, "0"))
		{
			return retKK0401.getString(KK0401ETMsg.PLAN_CHRG_STAYMD);
		}
		else
		{
			return opeDate;
		}
	}

	/**
	 * <p>
	 * サービス提供中（解約前／休止中前）のサービス課金開始年月日を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号 
	 * @param sbopSvcKeiNo サブオプションサービス契約番号 
	 * @param sbopSvcKeiStat サブオプションサービス契約ステータス 
	 * @return サービス課金開始年月日
	 * @throws SQLException 
	 */
	public String getSvcChrgStaymdMae(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object sbopSvcKeiNo, Object opSvcKeiStat) 
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 返却用変数
		String svcChrgStaymd = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0401ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0401.SVC_CHRG_STAYMD ");
			sql_Buff.append(" FROM   KK_T_SBOP_SVC_KEI KK0401 "); 
			sql_Buff.append(" WHERE "); 
			sql_Buff.append("     KK0401.OP_SVC_KEI_NO = ? "); 
			sql_Buff.append("     AND KK0401.SBOP_SVC_KEI_NO = ? ");
			sql_Buff.append("     AND (KK0401.OP_SVC_KEI_NO,KK0401.SBOP_SVC_KEI_NO, KK0401.RSV_APLY_YMD || KK0401.GENE_ADD_DTM) = "); 
			sql_Buff.append("          (SELECT KK0401_GENE.OP_SVC_KEI_NO, KK0401_GENE.SBOP_SVC_KEI_NO, MAX(KK0401_GENE.RSV_APLY_YMD || KK0401_GENE.GENE_ADD_DTM) AS KK0401_MAX "); 
			sql_Buff.append("           FROM   KK_T_SBOP_SVC_KEI KK0401_GENE "); 
			sql_Buff.append("           WHERE  KK0401_GENE.OP_SVC_KEI_NO = KK0401.OP_SVC_KEI_NO ");
			sql_Buff.append("           AND    KK0401_GENE.SBOP_SVC_KEI_NO = KK0401.SBOP_SVC_KEI_NO ");
			sql_Buff.append("           AND    KK0401_GENE.SBOP_SVC_KEI_STAT = ? ");
			sql_Buff.append("           AND    KK0401_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("           AND    KK0401_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("           AND    KK0401_GENE.MK_FLG = '0' ");
			sql_Buff.append("           GROUP BY KK0401_GENE.OP_SVC_KEI_NO, KK0401_GENE.SBOP_SVC_KEI_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(オプションサービス契約番号)
			CAANJDBCUtil.setParam(pstmt, 1, opSvcKeiNo);
			// パラメータの設定(オプションサービス契約ステータス)
			CAANJDBCUtil.setParam(pstmt, 2, sbopSvcKeiNo);
			// パラメータの設定(サブオプションサービス契約ステータス)
			CAANJDBCUtil.setParam(pstmt, 3, opSvcKeiStat);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 4, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// サービス課金開始年月日を取得する
			if (rsltQuery.next())
			{
				svcChrgStaymd = rsltQuery.getString("SVC_CHRG_STAYMD");
			}

		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
		return svcChrgStaymd;
	}

	/**
	 * <p>
	 * サービス提供中（解約前／休止中前）のプラン課金開始年月日を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号 
	 * @param sbopSvcKeiNo サブオプションサービス契約番号 
	 * @param sbopSvcKeiStat サブオプションサービス契約ステータス 
	 * @return プラン課金開始年月日
	 * @throws SQLException 
	 */
	public String getPlanChrgStaymdMae(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object sbopSvcKeiNo, Object opSvcKeiStat) 
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 返却用変数
		String planChrgStaymd = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0401ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0401.PLAN_CHRG_STAYMD ");
			sql_Buff.append(" FROM   KK_T_SBOP_SVC_KEI KK0401 "); 
			sql_Buff.append(" WHERE "); 
			sql_Buff.append("     KK0401.OP_SVC_KEI_NO = ? "); 
			sql_Buff.append("     AND KK0401.SBOP_SVC_KEI_NO = ? ");
			sql_Buff.append("     AND (KK0401.OP_SVC_KEI_NO,KK0401.SBOP_SVC_KEI_NO, KK0401.RSV_APLY_YMD || KK0401.GENE_ADD_DTM) = "); 
			sql_Buff.append("          (SELECT KK0401_GENE.OP_SVC_KEI_NO, KK0401_GENE.SBOP_SVC_KEI_NO, MAX(KK0401_GENE.RSV_APLY_YMD || KK0401_GENE.GENE_ADD_DTM) AS KK0401_MAX "); 
			sql_Buff.append("           FROM   KK_T_SBOP_SVC_KEI KK0401_GENE "); 
			sql_Buff.append("           WHERE  KK0401_GENE.OP_SVC_KEI_NO = KK0401.OP_SVC_KEI_NO ");
			sql_Buff.append("           AND    KK0401_GENE.SBOP_SVC_KEI_NO = KK0401.SBOP_SVC_KEI_NO ");
			sql_Buff.append("           AND    KK0401_GENE.SBOP_SVC_KEI_STAT = ? ");
			sql_Buff.append("           AND    KK0401_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("           AND    KK0401_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("           AND    KK0401_GENE.MK_FLG = '0' ");
			sql_Buff.append("           GROUP BY KK0401_GENE.OP_SVC_KEI_NO, KK0401_GENE.SBOP_SVC_KEI_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(オプションサービス契約番号)
			CAANJDBCUtil.setParam(pstmt, 1, opSvcKeiNo);
			// パラメータの設定(オプションサービス契約ステータス)
			CAANJDBCUtil.setParam(pstmt, 2, sbopSvcKeiNo);
			// パラメータの設定(サブオプションサービス契約ステータス)
			CAANJDBCUtil.setParam(pstmt, 3, opSvcKeiStat);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 4, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// プラン課金開始年月日を取得する
			if (rsltQuery.next())
			{
				planChrgStaymd = rsltQuery.getString("PLAN_CHRG_STAYMD");
			}

		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
		return planChrgStaymd;
	}
	
	/**
	 * <p>
	 * 指定したステータスの最新のサブオプションサービス契約のカラムを取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号 
	 * @param sbopSvcKeiNo サブオプションサービス契約番号 
	 * @param sbopSvcKeiStat サブオプションサービス契約ステータス 
	 * @param columnName 取得するカラム名
	 * @return プラン課金開始年月日
	 * @throws SQLException 
	 */
	public String getColumnByStat(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object sbopSvcKeiNo, Object opSvcKeiStat, String columnName) 
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 返却用変数
		String planChrgStaymd = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0401ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(columnName).append(" ");
			sql_Buff.append(" FROM   KK_T_SBOP_SVC_KEI KK0401 "); 
			sql_Buff.append(" WHERE "); 
			sql_Buff.append("     KK0401.OP_SVC_KEI_NO = ? "); 
			sql_Buff.append("     AND KK0401.SBOP_SVC_KEI_NO = ? ");
			sql_Buff.append("     AND (KK0401.OP_SVC_KEI_NO,KK0401.SBOP_SVC_KEI_NO, KK0401.RSV_APLY_YMD || KK0401.GENE_ADD_DTM) = "); 
			sql_Buff.append("          (SELECT KK0401_GENE.OP_SVC_KEI_NO, KK0401_GENE.SBOP_SVC_KEI_NO, MAX(KK0401_GENE.RSV_APLY_YMD || KK0401_GENE.GENE_ADD_DTM) AS KK0401_MAX "); 
			sql_Buff.append("           FROM   KK_T_SBOP_SVC_KEI KK0401_GENE "); 
			sql_Buff.append("           WHERE  KK0401_GENE.OP_SVC_KEI_NO = KK0401.OP_SVC_KEI_NO ");
			sql_Buff.append("           AND    KK0401_GENE.SBOP_SVC_KEI_NO = KK0401.SBOP_SVC_KEI_NO ");
			sql_Buff.append("           AND    KK0401_GENE.SBOP_SVC_KEI_STAT = ? ");
			sql_Buff.append("           AND    KK0401_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("           AND    KK0401_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("           AND    KK0401_GENE.MK_FLG = '0' ");
			sql_Buff.append("           GROUP BY KK0401_GENE.OP_SVC_KEI_NO, KK0401_GENE.SBOP_SVC_KEI_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(オプションサービス契約番号)
			CAANJDBCUtil.setParam(pstmt, 1, opSvcKeiNo);
			// パラメータの設定(オプションサービス契約ステータス)
			CAANJDBCUtil.setParam(pstmt, 2, sbopSvcKeiNo);
			// パラメータの設定(サブオプションサービス契約ステータス)
			CAANJDBCUtil.setParam(pstmt, 3, opSvcKeiStat);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 4, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// プラン課金開始年月日を取得する
			if (rsltQuery.next())
			{
				planChrgStaymd = rsltQuery.getString(columnName);
			}

		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
		return planChrgStaymd;
	}

	/**
	 * <p>
	 * サービス停止解除年月日の編集を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo 検索対象のオプションサービス契約番号
	 * @param sbopSvcKeiNo 検索対象のサブオプションサービス契約番号
	 * @param kaihkYmd 回復年月日
	 * @return サービス停止解除年月日
	 */
	public String getSvcStpRlsYmd(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object sbopSvcKeiNo, Object kaihkYmd)
	{
		String value = null;
		
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == outETMsg)
		{
			return null;
		}

		// 利用停止中（カレント．サービス停止年月日≠NULLかつカレント．サービス停止解除年月日＝NULL）の場合
		if (!outETMsg.isNull(KK0401ETMsg.SVC_STP_YMD) && outETMsg.isNull(KK0401ETMsg.SVC_STP_RLS_YMD))
		{
			value = kaihkYmd.toString();
		}
		else
		{
			value = outETMsg.getString(KK0401ETMsg.SVC_STP_RLS_YMD);
		}
		return value;
	}

	/**
	 * <p>
	 * サービス停止解除理由コードの編集を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo 検索対象のオプションサービス契約番号
	 * @param sbopSvcKeiNo 検索対象のサブオプションサービス契約番号
	 * @return サービス停止解除理由コード
	 */
	public String getSvcStpRlsRsnCd(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object sbopSvcKeiNo)
	{
		String value = null;
		
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == outETMsg)
		{
			return null;
		}

		// 利用停止中（カレント．サービス停止年月日≠NULLかつカレント．サービス停止解除年月日＝NULL）の場合
		if (!outETMsg.isNull(KK0401ETMsg.SVC_STP_YMD) && outETMsg.isNull(KK0401ETMsg.SVC_STP_RLS_YMD))
		{
			value = JKKModelConst.SVC_STP_RLS_RSN_CD_SKK;
		}
		else
		{
			value = outETMsg.getString(KK0401ETMsg.SVC_STP_RLS_RSN_CD);
		}
		return value;
	}
	
	/**
	 * <p>
	 * サブオプションサービス契約ステータスに応じてカレント引継を行うか判定します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param sbopSvcKeiNo 検索対象のサブオプションサービス契約番号
	 * @return 受付済、照査済、締結済であればfalse、それ以外の場合true
	 */
	public boolean isStatCurrent(CAANMsg inMsg, AgentDispatchContext inContext, Object sbopSvcKeiNo)
	{
		
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);
		
		if(outETMsg == null){
			return false;
		}

		String stat = outETMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT);
		
		if (JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(stat) || 
				JKKModelConst.SVC_KEI_STAT_SHOSA_ZM.equals(stat) || 
				JKKModelConst.SVC_KEI_STAT_CNC_ZM.equals(stat))
		{
			return false;
		}
		return true;
	}
}
