/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *  システム名		：eo顧客基幹システム
 *  モジュール名	：JKKejbKK0351NumberParts
 *  ソースファイル名：JKKejbKK0351NumberParts.java
 *  作成者			：富士通
 *  日付			：2011年03月14日
 *＜機能概要＞
 *  オプションサービス契約世代登録年月日時分秒取得部品クラス
 *＜修正履歴＞
 *  バージョン	修正日		修正者		修正内容
 *  v1.00.00	2011/06/14	富士通		新規作成
 *  v4.00.00	2013/02/15	FJ）藤本	ST3-2013-0000390
 *  v4.00.01    2013/02/26  FJ）寺本    ST3-2013-0000390
 *  v4.00.02    2013/03/25  FJ）寺園    IT1-2013-0000593
 *  v4.00.03    2013/04/02  FJ）寺園    ST2-2013-0001542
 *  v4.00.04    2013/07/14  FJ）竹内    LT-2013-0000391
 *  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.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0361ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0361C050CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0351DBABase;
import eo.ejb.common.db.JKKejbKK0361DBABase;

/**
 * <p>
 * オプションサービス契約世代登録年月日時分秒取得部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0351Edit extends JKKejbKK0351DBABase
{

	/** 年月日：最大値 */
	private static final String YMD_MAX = "20991231";

	/**
	 * コンストラクタです。
	 */
	public JKKejbKK0351Edit()
	{
	}

	/**
	 * <p>
	 * オプションサービス契約のカレントレコードの世代登録年月日時分秒を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return 指定されたオプションサービス契約番号に紐付くカレントレコードの世代登録年月日時分秒
	 */
	public Object getCurrentGeneAddDtm(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo)
	{
		// カレント検索用のオプションサービス契約の内部スキーマメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 作成したメッセージを使用してカレント検索を行う
		CAANMsg otETMsg = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == otETMsg)
		{
			return null;
		}

		return otETMsg.getString(KK0351ETMsg.GENE_ADD_DTM);
	}
	
	/**
	 * <p>
	 * 年月日取得(マルチセッション用セッション数変更)処理
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param mltiseSessionCnt マルチセッション用セッション数
	 * @param ymdKbn 1:プラン開始年月日、2:プラン終了年月日、3:プラン課金開始年月日、4:プラン課金終了年月日
	 * @return 各設定値
	 */
	public String getYmdMltiseSessionCnt(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object mltiseSessionCnt, Object ymdKbn)
	{
		String opeDate = JKKModelCommon.getOpeDate(inMsg);
		// マルチセッション用セッション数変更判定
		if (chgMltiseSessionCnt(inMsg, inContext, opSvcKeiNo, mltiseSessionCnt))
		{
			// 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 inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
			inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(EKK0361C050CBSMsg.OP_SVC_KEI_NO));
			inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);

			// オプションサービス契約のカレント検索を行う
			CAANMsg ret0351 = new JKKejbKK0351DBABase().findByCurrent(inETMsgKK0351);

			// 検索結果がnullだった場合
			if (ret0351 == null)
			{
				return null;
			}

			// 1:プラン開始年月日の場合
			if ("1".equals(ymdKbn))
			{
				return ret0351.getString(KK0351ETMsg.PLAN_STAYMD);
			}
			// 2:プラン終了年月日の場合
			else if ("2".equals(ymdKbn))
			{
				return ret0351.getString(KK0351ETMsg.PLAN_ENDYMD);
			}
			// 3:プラン課金開始年月日の場合
			else if ("3".equals(ymdKbn))
			{
				return ret0351.getString(KK0351ETMsg.PLAN_CHRG_STAYMD);
			}
			// 4:プラン課金終了年月日の場合
			else if ("4".equals(ymdKbn))
			{
				return ret0351.getString(KK0351ETMsg.PLAN_CHRG_ENDYMD);
			}
		}
		return null;

	}

	/**
	 * <p>
	 * マルチセッション用セッション数変更判定
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param mltiseSessionCnt マルチセッション用セッション数
	 * @return 入力値.マルチセッション用セッション数≠カレント.マルチセッション用セッション数の場合true
	 */
	public boolean chgMltiseSessionCnt(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object mltiseSessionCnt)
	{
		// 入力値.マルチセッション用セッション数が未設定の場合
		if (null == mltiseSessionCnt || "".equals(mltiseSessionCnt))
		{
			return false;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
		inETMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, inMsg.getString(EKK0361C050CBSMsg.OP_SVC_KEI_NO));

		// オプションサービス契約<ISP>のカレント検索を行う
		CAANMsg ret0361 = new JKKejbKK0361DBABase().findByCurrent(inETMsgKK0361);

		// 検索結果がnullだった場合
		if (ret0361 == null)
		{
			return false;
		}

		String crtMltiseSessionCnt = ret0361.getString(KK0361ETMsg.MLTISE_SESSION_CNT);

		// 入力値.マルチセッション用セッション数＝カレントレコード.マルチセッション用セッション数の場合
		if (mltiseSessionCnt.equals(crtMltiseSessionCnt))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * プラン課金開始年月日に設定する年月日を判定する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return 運用日 or カレント引継
	 */
	private String jdgPlanChrgStaYmd(CAANMsg inMsg)
	{
		// 運用日付を取得する
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(EKK0361C050CBSMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = new JKKejbKK0351DBABase().findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合
		if (ret0351 == null)
		{
			return null;
		}

		// サービス課金開始年月日が未設定の場合は運用日付を返却する
		if (ret0351.isNull(KK0351ETMsg.SVC_CHRG_STAYMD))
		{
			return opeDate;
		}

		// カレントのサービス課金開始年月日が運用日付より未来日の場合
		if (JKKModelCommon.isFutureDate(ret0351.getString(KK0351ETMsg.SVC_CHRG_STAYMD), opeDate, "0"))
		{
			return ret0351.getString(KK0351ETMsg.PLAN_CHRG_STAYMD);
		}
		else
		{
			return opeDate;
		}
	}

	/**
	 * <p>
	 * サービス提供中（解約前／休止中前）のサービス課金開始年月日を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号 
	 * @param opSvcKeiStat オプションサービス契約ステータス 
	 * @return サービス課金開始年月日
	 * @throws SQLException 
	 */
	public String getSvcChrgStaymdMae(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object opSvcKeiStat) 
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 返却用変数
		String svcChrgStaymd = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0351.SVC_CHRG_STAYMD ");
			sql_Buff.append(" FROM   KK_T_OP_SVC_KEI KK0351 ");
			sql_Buff.append(" WHERE  KK0351.OP_SVC_KEI_NO = ? ");
			sql_Buff.append(" AND    (KK0351.OP_SVC_KEI_NO, KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM) = ");
			sql_Buff.append("        (SELECT KK0351_GENE.OP_SVC_KEI_NO, MAX(KK0351_GENE.RSV_APLY_YMD || KK0351_GENE.GENE_ADD_DTM) AS KK0351_MAX ");
			sql_Buff.append("         FROM   KK_T_OP_SVC_KEI KK0351_GENE ");
			sql_Buff.append("         WHERE  KK0351_GENE.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ");
			sql_Buff.append(" AND    KK0351_GENE.OP_SVC_KEI_STAT = ? ");
			sql_Buff.append(" AND    KK0351_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" AND    KK0351_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append(" AND    KK0351_GENE.MK_FLG = '0' ");
			sql_Buff.append(" GROUP BY KK0351_GENE.OP_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, opSvcKeiStat);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, 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 opSvcKeiStat オプションサービス契約ステータス 
	 * @return プラン課金開始年月日
	 * @throws SQLException 
	 */
	public String getPlanChrgStaymdMae(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object opSvcKeiStat) 
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 返却用変数
		String planChrgStaymd = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0351.PLAN_CHRG_STAYMD ");
			sql_Buff.append(" FROM   KK_T_OP_SVC_KEI KK0351 ");
			sql_Buff.append(" WHERE  KK0351.OP_SVC_KEI_NO = ? ");
			sql_Buff.append(" AND    (KK0351.OP_SVC_KEI_NO, KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM) = ");
			sql_Buff.append("        (SELECT KK0351_GENE.OP_SVC_KEI_NO, MAX(KK0351_GENE.RSV_APLY_YMD || KK0351_GENE.GENE_ADD_DTM) AS KK0351_MAX ");
			sql_Buff.append("         FROM   KK_T_OP_SVC_KEI KK0351_GENE ");
			sql_Buff.append("         WHERE  KK0351_GENE.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ");
			sql_Buff.append(" AND    KK0351_GENE.OP_SVC_KEI_STAT = ? ");
			sql_Buff.append(" AND    KK0351_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" AND    KK0351_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append(" AND    KK0351_GENE.MK_FLG = '0' ");
			sql_Buff.append(" GROUP BY KK0351_GENE.OP_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, opSvcKeiStat);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, 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 opSvcKeiStat オプションサービス契約ステータス 
	 * @return プラン課金開始年月日
	 * @throws SQLException 
	 */
	public String getColumnByStat(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object opSvcKeiStat, String columnName) 
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 返却用変数
		String planChrgStaymd = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(columnName).append(" ");
			sql_Buff.append(" FROM   KK_T_OP_SVC_KEI KK0351 ");
			sql_Buff.append(" WHERE  KK0351.OP_SVC_KEI_NO = ? ");
			sql_Buff.append(" AND    (KK0351.OP_SVC_KEI_NO, KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM) = ");
			sql_Buff.append("        (SELECT KK0351_GENE.OP_SVC_KEI_NO, MAX(KK0351_GENE.RSV_APLY_YMD || KK0351_GENE.GENE_ADD_DTM) AS KK0351_MAX ");
			sql_Buff.append("         FROM   KK_T_OP_SVC_KEI KK0351_GENE ");
			sql_Buff.append("         WHERE  KK0351_GENE.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ");
			sql_Buff.append(" AND    KK0351_GENE.OP_SVC_KEI_STAT = ? ");
			sql_Buff.append(" AND    KK0351_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" AND    KK0351_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append(" AND    KK0351_GENE.MK_FLG = '0' ");
			sql_Buff.append(" GROUP BY KK0351_GENE.OP_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, opSvcKeiStat);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, 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>
	 * サービス提供物消去処理実施年月日時分秒の編集チェックを行います。<br>
	 * オプション引継に伴う引継元のオプション解約(またはキャンセル)の場合、当該日時を設定する。(Ｍｙホームページは別途条件あり)
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param idoDiv 異動区分
	 * @return true:設定する、false:設定しない
	 */
	public boolean isChkSvctkButDelTrnJssiDtm(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo, String idoDiv)
	{
		/* ----------------------------------------------------------------------------------------------------
		 * ■解約(またはキャンセル)時におけるサービス提供物消去処理実施年月日時分秒の設定
		 * ≪前提≫消去処理は、解約(またはキャンセル)後、回復可能期間(またはキャンセル取消可能期間)を経過した
		 *   サービスについて、使用されていた提供物(認証ID、電話番号など)を消去するものである。
		 * 
		 * ≪特殊仕様≫オプション引継に伴う引継元のオプション解約(またはキャンセル)の場合、
		 *   オプションサービスの提供物(POPID、WebIDなど)を引継先で継続利用するため、消去処理を実施しない。
		 *   消去は、バッチ処理にて、サービス提供物消去処理実施年月日時分秒が未設定の「オプションサービス契約」を対象とするため、
		 *   解約(またはキャンセル)時点で、当該項目を設定しておくことで、消去処理対象外とする。
		 *   この場合、サービス提供物消去処理実施年月日時分秒が設定されているが、実際には消去処理は行われていない。
		 * ---------------------------------------------------------------------------------------------------- */
		// 異動区分が"オプション引継"以外の場合、設定しない
		if (!JKKModelConst.IDO_DIV_OP_HKTGI.equals(idoDiv))
		{
			return false;
		}

		// オプションサービス契約番号が未設定(未採番)の場合、設定しない
		if (opSvcKeiNo == null || "".equals(opSvcKeiNo))
		{
			return false;
		}

		// 対象の「オプションサービス契約」カレントレコードを取得する。
		CAANMsg kk0351Msg = new JKKejbKK0351DBABase().getKK0351Current(opSvcKeiNo, JKKModelCommon.getOpeDate(inCBSMsg));

		// オプションサービスコードが"Ｍｙホームページ"の場合
		if (JKKModelConst.OP_SVC_CD_MY_HP.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			/* ------------------------------------------------------------------------------------------------------------------------
			 * ■Ｍｙホームページのオプション引継
			 * ≪前提≫Ｍｙホームページオプションは、無料オプションであるため、ユーザの意思によらず、必ず作成される。
			 *   Ｍｙホームページオプションが未使用の場合、URL(アカウント)が未設定となり、
			 *   親「サービス契約」(eo光ネット)が【サービス提供中】であっても、「オプションサービス契約」(Ｍｙホームページ)は【締結済】で留まる。
			 *   その後、ユーザからの利用申込を受けて、URL(アカウント)が設定され、【サービス提供中】に遷移する。
			 * 
			 * ≪特殊仕様≫１つのネット契約に対して、Ｍｙホームページオプションは最大１契約であるため、
			 *   Ｍｙホームページのオプション引継では、以下のような解約・新規が必要となる。
			 *     例）    オプサ契番号  ステータス      URL   サ提消去日時  ⇒    オプサ契番号  ステータス      URL   サ提消去日時
			 *     引継元：xxxxxxxxxx01  サービス提供中  AAAA  null          ⇒@  xxxxxxxxxx01  解約済          AAAA  yyyymmddhhmmssSSS
			 *                                                               ⇒B  xxxxxxxxxx03  締結済(未使用)  null  null(※)
			 *     引継先：xxxxxxxxxx02  締結済(未使用)  null  null          ⇒A  xxxxxxxxxx02  解約済          null  null
			 *                                                               ⇒@  xxxxxxxxxx04  サービス提供中  AAAA  null
			 *     @引継元の「オプションサービス契約」を解約(またはキャンセル)し、引継先の「オプションサービス契約」を新規作成する。
			 *     A引継先の「オプションサービス契約」(未使用)を解約(またはキャンセル)する。(引継先がＭｙホームページ使用中の場合は引継不可)
			 *     B引継元の「オプションサービス契約」(未使用)を新規作成する。(※親「サービス契約」(eo光ネット)が【解約済】の場合、即時解約する。)
			 *   @の解約済Ｍｙホームページは継続利用されるため、消去処理対象外として、サービス提供物消去処理実施年月日時分秒を設定する。
			 *   A、Bの解約済Ｍｙホームページは未使用のまま消去処理対象となるため、サービス提供物消去処理実施年月日時分秒を設定しない。
			 * ------------------------------------------------------------------------------------------------------------------------ */
			// 対象の「オプションサービス契約<ISP>」を取得する。
			CAANMsg kk0361Msg = new JKKejbKK0361DBABase().getKK0361Primary(opSvcKeiNo, kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));

			// URL(アカウント)が未設定の場合、設定しない
			if (kk0361Msg.isNull(KK0361ETMsg.URL_ACCOUNT))
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * <p>
	 * サービス停止解除年月日の編集を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo 検索対象のオプションサービス契約番号
	 * @param kaihkYmd 回復年月日
	 * @return サービス停止解除年月日
	 */
	public String getSvcStpRlsYmd(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object kaihkYmd)
	{
		String value = null;
		
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == outETMsg)
		{
			return null;
		}

		// 利用停止中（カレント．サービス停止年月日≠NULLかつカレント．サービス停止解除年月日＝NULL）の場合
		if (!outETMsg.isNull(KK0351ETMsg.SVC_STP_YMD) && outETMsg.isNull(KK0351ETMsg.SVC_STP_RLS_YMD))
		{
			value = kaihkYmd.toString();
		}
		else
		{
			value = outETMsg.getString(KK0351ETMsg.SVC_STP_RLS_YMD);
		}
		return value;
	}

	/**
	 * <p>
	 * サービス停止解除理由コードの編集を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo 検索対象のオプションサービス契約番号
	 * @return サービス停止解除理由コード
	 */
	public String getSvcStpRlsRsnCd(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo)
	{
		String value = null;
		
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == outETMsg)
		{
			return null;
		}

		// 利用停止中（カレント．サービス停止年月日≠NULLかつカレント．サービス停止解除年月日＝NULL）の場合
		if (!outETMsg.isNull(KK0351ETMsg.SVC_STP_YMD) && outETMsg.isNull(KK0351ETMsg.SVC_STP_RLS_YMD))
		{
			value = JKKModelConst.SVC_STP_RLS_RSN_CD_SKK;
		}
		else
		{
			value = outETMsg.getString(KK0351ETMsg.SVC_STP_RLS_RSN_CD);
		}
		return value;
	}
	
	/**
	 * <p>
	 * オプションサービス契約ステータスに応じてカレント引継を行うか判定します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param opSvcKeiNo 検索対象のオプションサービス契約番号
	 * @return 受付済、照査済、締結済であればfalse、それ以外の場合true
	 */
	public boolean isStatCurrent(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo)
	{
		
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);
		
		if(outETMsg == null){
			return false;
		}

		String stat = outETMsg.getString(KK0351ETMsg.OP_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;
	}
}
