/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0401KRCK
*   ソースファイル名：JKKejbKK0401KRCK.java
*   作成者          ：富士通
*   日付            ：2011年04月21日
*＜機能概要＞
*   サブオプションサービス契約の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/04/21  富士通      新規作成
*	v4.00.00	2013/03/26	FJ）阿部	IT1-2013-0000572
*	v4.00.01	2013/06/11	FJ）寺園	IT2-2013-0000511
*   v8.00.00	2014/03/25	FJ）小島	OM-2014-0000286
*	v39.00.00	2018/10/12	FJ)山地		【ANK-3484-00-00】端末補償サービス導入対応
*   v39.00.01	2018/10/12	FJ)山地		IT1-2018-0000186 PCワイドプランの前月末解約対応
*
**********************************************************************/

package eo.ejb.common.entity;

import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.util.JPCDateUtil;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0401LE;
import eo.ejb.cbm.entity.KK0411ETMsg;
import eo.ejb.cbm.entity.KK1881ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0401C170CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0351DBABase;
import eo.ejb.common.db.JKKejbKK0401DBABase;
import eo.ejb.common.db.JKKejbKK0411DBABase;
import eo.ejb.common.db.JKKejbKK1881DBABase;
import eo.ejb.common.db.JKKejbZM0321DBAccess;

/**
 * <p>
 * サブオプションサービス契約の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0401KRCK extends JKKejbKK0401DBABase
{

	/** 業務パラメータ */
	private static final String PARAM_ID = "FU_CHGALIAS_FAIL_PRD";

	/** NGワードコード（エイリアス） */
	private static final String NG_WORD_CD_ALIAS = "10";

	/** サービス解約理由コード（引継解約） */
	private static final String SVC_DLRE_CD_KAI_OVER = "04";
	// IT1-2018-0000186 ADD START
	/** ＰＣプラン */
	private static final String OP_SVC_CD_B133 = "B133";
	/** ＰＣワイドプラン */
	private static final String SBOP_SVC_CD_D12 = "D12";
	// IT1-2018-0000186 ADD END
	/**
	 * <p>
	 * 新しいJKKejbKK0401KRCKを作成します。
	 * </p>
	 */
	public JKKejbKK0401KRCK()
	{
		super();
	}

	/**
	 * <p>
	 * サブオプションサービス契約の存在チェックを行います。（世代登録年月日時分秒を除く有効なレコード）
	 * </p>
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcKeiNo サブオプションサービス契約番号
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExistsNonGene(String opSvcKeiNo, String sbopSvcKeiNo)
	{
		if(null == opSvcKeiNo || "".equals(opSvcKeiNo))
		{
			return true;
		}

		if(null == sbopSvcKeiNo || "".equals(sbopSvcKeiNo))
		{
			return true;
		}
		
		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0401ETMsg.class.getName());
		msg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		msg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		msg.set(KK0401ETMsg.MK_FLG, "0");

		// ロジカルエンティティ生成
		KK0401LE le = new KK0401LE();

		try
		{
			CAANMsg[] rsltList = le.findByCondition(msg);

			//存在しない場合
			if (rsltList.length == 0)
			{
				return false;
			}

			//存在する場合
			return true;
		}
		catch (CAANException ex)
		{
			throw new CAANRuntimeException(ex);
		}
	}

	/**
	 * <p>
	 * 変更不可期間のチェックを行う。
	 * </p>
	 * @param  inMsg 処理対象のメッセージキャリア
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @return 運用日を超えている場合はfalse。超えていない場合はtrue。
	 */
	public boolean isNotChangePrd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg resETMsg = super.findByCurrent(inETMsg);

		if (resETMsg != null)
		{
			// 判定結果がnullでない場合、サブオプションサービスコードを判定する
			if (!JKKModelConst.SBOP_SVC_CD_MAILALIAS.equals(resETMsg.getString(KK0401ETMsg.SBOP_SVC_CD)))
			{
				return true;
			}

			JKKejbZM0321DBAccess jKKejbZM0321DBAccessIns = new JKKejbZM0321DBAccess();

			// 以下のパラメータを設定しgetParamEの呼び出しを行い業務パラメータの値取得を行う。
			String value = jKKejbZM0321DBAccessIns.getParamE(PARAM_ID);

			// サブオプション契約<ISP>カレント検索用のメッセージを作成
			CAANMsg isETMsg = new CAANMsg(KK0411ETMsg.class.getName());
			isETMsg.set(KK0411ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0411ETMsg.OP_SVC_KEI_NO));
			isETMsg.set(KK0411ETMsg.SBOP_SVC_KEI_NO, inMsg.getString(KK0411ETMsg.SBOP_SVC_KEI_NO));

			// サブオプションサービス契約<ISP>のカレント検索を行う
			CAANMsg rtnETMsg = new JKKejbKK0411DBABase().findByCurrent(isETMsg);

			//サブオプションサービス契約<ISP>のカレントレコードが取得できない場合は処理を終了する
			if (rtnETMsg == null)
			{
				return true;
			}
			
			// エイリアス変更年月日がnullでない場合
			if (rtnETMsg.getString(KK0411ETMsg.ALIAS_CHGE_YMD) != null)
			{
				// 日付を編集する
				String yyyymmdd = JPCDateUtil.addDay(rtnETMsg.getString(KK0411ETMsg.ALIAS_CHGE_YMD), Integer.parseInt(value));
	
				// 運用日付と編集した値で比較をおこなう。
				if (JKKModelCommon.getOpeDate(inMsg).compareTo(yyyymmdd) < 0)
				{
					return false;
				}
			}
		}
		return true;
	}

	/**
	 * <p>
	 * メールエイリアスの変更チェックを行う。
	 * </p>
	 * @param  inMsg 処理対象のメッセージキャリア
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @return 一致しない場合true。一致する場合はfalse。
	 */
	public boolean isMlAliasChg(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg resETMsg = super.findByCurrent(inETMsg);

		if (resETMsg != null)
		{
			// 判定結果がnullでない場合、サブオプションサービスコードを判定する
			if (!JKKModelConst.SBOP_SVC_CD_MAILALIAS.equals(resETMsg.getString(KK0401ETMsg.SBOP_SVC_CD)))
			{
				return true;
			}
			
			// カレント検索用のメッセージを作成
			CAANMsg inETMsgIsp = new CAANMsg(KK0411ETMsg.class.getName());
			inETMsgIsp.set(KK0411ETMsg.OP_SVC_KEI_NO, resETMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO));
			inETMsgIsp.set(KK0411ETMsg.SBOP_SVC_KEI_NO, resETMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));

			// サブオプションサービス契約<ISP>のカレント検索を行う
			CAANMsg resETMsgIsp = new JKKejbKK0411DBABase().findByCurrent(inETMsgIsp);

			// 判定結果がnullでない場合、エイリアスを判定する
			if (inMsg.getString(KK0411ETMsg.ALIAS) != null && !inMsg.getString(KK0411ETMsg.ALIAS).equals(resETMsgIsp.getString(KK0411ETMsg.ALIAS)))
			{
				return true;
			}
		}

		return false;
	}

	/**
	 * <p>
	 * エイリアスの必須チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return エイリアスがNullでない場合はtrue。Nullである場合はfalse。
	 */
	public boolean isNotNullAlias(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg resETMsg = super.findByCurrent(inETMsg);

		// カレントレコードが取得できない場合、trueを返却する
		if (resETMsg == null)
		{
			return true;
		}

		// サブオプションサービスコードが「メールエイリアス」でない場合、trueを返却する
		if (!JKKModelConst.SBOP_SVC_CD_MAILALIAS.equals(resETMsg.getString(KK0401ETMsg.SBOP_SVC_CD)))
		{
			return true;
		}

		// 「エイリアス」がNULLでない場合はtrueを返却する
		if (!inMsg.isNull(KK0411ETMsg.ALIAS))
		{
			return true;
		}

		// エイリアスがNULLの場合、falseを返却する
		return false;
	}

	/**
	 * <p>
	 * エイリアス  NGチェック処理
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return エイリアスが、NGワードに存在する場合false。それ以外の場合true。
	*/
	public boolean isNotNgAlias(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String opSvcKeiNo = inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO);
		String sbopSvcKeiNo = inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// 対象の「サブオプションサービス契約」カレントレコードを取得
		CAANMsg kk0401Msg = new JKKejbKK0401DBABase().getKK0401Current(opSvcKeiNo, sbopSvcKeiNo, opeDate);

		// サブオプションサービスコードが"メールエイリアス"以外の場合、チェック対象外
		if (!JKKModelConst.SBOP_SVC_CD_MAILALIAS.equals(kk0401Msg.getString(KK0401ETMsg.SBOP_SVC_CD)))
		{
			return true;
		}

		// NGワードチェック処理を呼び出し、その結果を返却する
		JKKejbKRCKCommon krckc = new JKKejbKRCKCommon();
		return krckc.isNotExistsNg(inMsg, inContext, NG_WORD_CD_ALIAS, inMsg.getString(KK0411ETMsg.ALIAS));
	}

	/**
	 * <p>
	 * サブオプションサービスコードがメール容量追加の場合、追加容量の必須チェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true:チェックＯＫ、false:チェックＮＧ
	 */
	public boolean isNotNullAddCapaMl(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		return isNotNullAddCapa(inMsg, inContext, JKKModelConst.SBOP_SVC_CD_ML_CAPA_ADD);
	}

	/**
	 * <p>
	 * サブオプションサービスコードがホームページ容量追加の場合、追加容量の必須チェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true:チェックＯＫ、false:チェックＮＧ
	 */
	public boolean isNotNullAddCapaHp(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		return isNotNullAddCapa(inMsg, inContext, JKKModelConst.SBOP_SVC_CD_HP_CAPA_ADD);
	}

	/**
	 * <p>
	 * メール容量(またはホームページ容量)の追加容量の必須チェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param chkTgSbopSvcCd チェック対象サブオプションサービスコード
	 * @return true:チェックＯＫ、false:チェックＮＧ
	 */
	public boolean isNotNullAddCapa(CAANMsg inMsg, AgentDispatchContext inContext, String chkTgSbopSvcCd)
	{
		String opSvcKeiNo = inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO);
		String sbopSvcKeiNo = inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// 対象の「サブオプションサービス契約」カレントレコードを取得
		CAANMsg kk0401Msg = new JKKejbKK0401DBABase().getKK0401Current(opSvcKeiNo, sbopSvcKeiNo, opeDate);

		// サブオプションサービスコードが"メール容量追加"(または"ホームページ容量追加")以外の場合、チェック対象外
		if (!chkTgSbopSvcCd.equals(kk0401Msg.getString(KK0401ETMsg.SBOP_SVC_CD)))
		{
			return true;
		}

		// 追加容量が未設定の場合、チェックエラー
		if (inMsg.isNull(KK0411ETMsg.ADD_CAPA))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * サブオプションサービスコードがメール容量追加の場合、追加容量の上限チェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param chkPtn チェックパターン("1"：登録IF / "2"：変更IF)
	 * @return true:チェックＯＫ、false:チェックＮＧ
	 */
	public boolean isCapaAddUpplMlAdd(CAANMsg inMsg, AgentDispatchContext inContext, String chkPtn)
	{
		return isCapaAddUppl(inMsg, inContext, JKKModelConst.SBOP_SVC_CD_ML_CAPA_ADD, chkPtn);
	}

	/**
	 * <p>
	 * サブオプションサービスコードがホームページ容量追加の場合、追加容量の上限チェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param chkPtn チェックパターン("1"：登録IF / "2"：変更IF)
	 * @return true:チェックＯＫ、false:チェックＮＧ
	 */
	public boolean isCapaAddUpplHpAdd(CAANMsg inMsg, AgentDispatchContext inContext, String chkPtn)
	{
		return isCapaAddUppl(inMsg, inContext, JKKModelConst.SBOP_SVC_CD_HP_CAPA_ADD, chkPtn);
	}

	/**
	 * <p>
	 * メール容量(またはホームページ容量)の追加容量の上限チェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param chkTgSbopSvcCd チェック対象サブオプションサービスコード
	 * @param chkPtn チェックパターン("1"：登録IF / "2"：変更IF)
	 * @return true:チェックＯＫ、false:チェックＮＧ
	 */
	public boolean isCapaAddUppl(CAANMsg inMsg, AgentDispatchContext inContext, String chkTgSbopSvcCd, String chkPtn)
	{
		String opSvcKeiNo = null;
		String sbopSvcKeiNo = null;
		String sbopSvcCd = null;
		String addCapa = null;
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// 登録IF
		if ("1".equals(chkPtn))
		{
			/* --------------------------------------------------------------------------------
			 * チェック実施条件
			 * @入力.オプションサービス契約番号が設定(採番)されていること。
			 * Aチェック対象のサブオプションであること。
			 * B入力.追加容量が設定されていること。
			 * -------------------------------------------------------------------------------- */
			// オプションサービス契約番号が未設定の場合、チェック対象外
			opSvcKeiNo = inMsg.getString(KK0411ETMsg.OP_SVC_KEI_NO);
			if (opSvcKeiNo == null || "".equals(opSvcKeiNo))
			{
				return true;
			}

			// サブオプションサービスコードが"メール容量追加"(または"ホームページ容量追加")以外の場合、チェック対象外
			sbopSvcCd = getSbop_Svc_cd();
			if (!chkTgSbopSvcCd.equals(sbopSvcCd))
			{
				return true;
			}

			// 入力.追加容量が未設定の場合、チェック対象外
			addCapa = inMsg.getString(KK0411ETMsg.ADD_CAPA);
			if (opSvcKeiNo == null || "".equals(opSvcKeiNo))
			{
				return true;
			}
		}
		// 変更IF
		else if ("2".equals(chkPtn))
		{
			/* --------------------------------------------------------------------------------
			 * チェック実施条件
			 * @入力.オプションサービス契約番号、サブオプションサービス契約番号が設定(採番)されていること。
			 * Aチェック対象のサブオプションであること。
			 * B入力.追加容量が設定されていること。
			 * -------------------------------------------------------------------------------- */
			// オプションサービス契約番号、サブオプションサービス契約番号が未設定の場合、チェック対象外
			opSvcKeiNo = inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO);
			sbopSvcKeiNo = inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);
			if ((opSvcKeiNo == null || "".equals(opSvcKeiNo)) || (sbopSvcKeiNo == null || "".equals(sbopSvcKeiNo)))
			{
				return true;
			}

			// 対象の「サブオプションサービス契約」カレントレコードを取得
			CAANMsg searchKey = new CAANMsg(KK0401ETMsg.class.getName());
			searchKey.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
			searchKey.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
			searchKey.set(KK0401ETMsg.RSV_APLY_YMD, opeDate);
			
			CAANMsg kk0401Msg = new JKKejbKK0401DBABase().findByCurrent(searchKey);
			
			// サブオプションサービス契約が存在しない場合、チェック対象外
			if (kk0401Msg == null)
			{
				return true;
			}

			// サブオプションサービスコードが"メール容量追加"(または"ホームページ容量追加")以外の場合、チェック対象外
			sbopSvcCd = kk0401Msg.getString(KK0401ETMsg.SBOP_SVC_CD);
			if (!chkTgSbopSvcCd.equals(sbopSvcCd))
			{
				return true;
			}

			// 入力.追加容量が未設定の場合、チェック対象外
			addCapa = inMsg.getString(KK0411ETMsg.ADD_CAPA);
			if (opSvcKeiNo == null || "".equals(opSvcKeiNo))
			{
				return true;
			}
		}
		else
		{
			throw new CAANRuntimeException("未定義のチェックパターンです。");
		}

		// 追加容量の増減幅チェック
		return isSvctkButZougenChk(sbopSvcCd, addCapa, opSvcKeiNo, opeDate);
	}

	/**
	 * <p>
	 * 該当の「サブオプションサービス契約」におけるサービス提供物（メール容量など）の追加分の増減幅が
	 * 料金コース_サブオプションサービス.サービス提供物増減値で定義された値であるかチェックを行う。
	 * </p>
	 * @param  sbopSvcCd サブオプションサービスコード
	 * @param  chgTgVal 変更対象値（追加容量など）
	 * @param  opSvcKeiNo オプションサービス契約番号
	 * @param  opeDate 運用日付
	 * @return true:変更対象値が規定の増減幅である場合、false:それ以外の場合
	 */
	public boolean isSvctkButZougenChk(String sbopSvcCd, String chgTgVal, String opSvcKeiNo, String opeDate)
	{
		// オプションサービス契約のカレント検索を行う
		CAANMsg kk0351Msg = new JKKejbKK0351DBABase().getKK0351Current(opSvcKeiNo, opeDate);

		// サービス契約のカレント検索を行う
		CAANMsg kk0081Msg = new JKKejbKK0081DBABase().getKK0081Current(kk0351Msg.getString(KK0351ETMsg.SVC_KEI_NO), opeDate);

		// 対象となる「料金コース_サブオプションサービス」を取得する。
		String pcrsCd = kk0081Msg.getString(KK0081ETMsg.PCRS_CD);
		CAANMsg[] kk1881MsgList = new JKKejbKK1881DBABase().getKK1881byPcrs_SbopSvc(pcrsCd, sbopSvcCd, opeDate);
		if (kk1881MsgList.length != 1)
		{
			throw new CAANRuntimeException("対象の料金コース_サブオプションサービスが０件、または複数件存在します。" +
					"料金コースコード:" + pcrsCd + "、サブオプションサービスコード:" + sbopSvcCd);
		}

		// サービス提供物増減値
		long svctkButZougenValue = kk1881MsgList[0].getStringAsLong(KK1881ETMsg.SVCTK_BUT_ZOUGEN_VALUE);

		// サービス提供物増減値が０の場合、チェックエラー
		if (svctkButZougenValue == 0)
		{
			return false;
		}
		// 変更対象値がサービス提供物増減値で指定された増減幅でない（サービス提供物増減値で除算した余りが０でない）場合、チェックエラー
		int lest = Integer.parseInt(chgTgVal) % (int)svctkButZougenValue;
		if (lest != 0)
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * サービス解約理由コードのチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return サービス解約理由コードが引継解約の場合はfalse。左記以外の場合はtrue。
	 */
	public boolean isCheckDlreCdCurrent(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		// 「オプションサービス契約」が未入力の場合はチェックを行わない
		if (inMsg.isNull(KK0401ETMsg.OP_SVC_KEI_NO))
		{
			return true;
		}
		
		// 「サブオプションサービス契約」が未入力の場合はチェックを行わない
		if (inMsg.isNull(KK0401ETMsg.SBOP_SVC_KEI_NO))
		{
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg ret0401 = findByCurrent(inETMsg);
		
		// 検索結果がnullだった場合はtrueを返却
		if (ret0401 == null)
		{
			return true;
		}

		// カレントのサービス解約理由コードが"04"（引継解約）の場合はfalseを返却する
		if (!SVC_DLRE_CD_KAI_OVER.equals(ret0401.getString(KK0401ETMsg.SVC_DLRE_CD)))
		{
			return true;
		}

		return false;
	}

	/** サブオプションサービスコード */
	private String sbop_svc_cd = null;

	/**
	 * <p>
	 * サブオプションサービスコードを取得します。
	 * </p>
	 * @return サブオプションサービスコード
	 */
	private String getSbop_Svc_cd()
	{
		return this.sbop_svc_cd;
	}

	/**
	 * <p>
	 * サブオプションサービスコードを設定します。
	 * </p>
	 * @param p_sbop_svc_cd サブオプションサービスコード
	 */
	public void setSbop_Svc_cd(String p_sbop_svc_cd)
	{
		this.sbop_svc_cd = p_sbop_svc_cd;
	}

	/**
	 * <p>
	 * 該当のサブオプションサービス契約に紐づく親オプションの契約状態をチェックする。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true:契約状態が同一である場合、false:それ以外の場合
	 */
	public boolean isStatChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String opSvcKeiNo = inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO);
		
		// オプションサービス契約のカレント検索を行う
		CAANMsg kk0351Msg = new JKKejbKK0351DBABase().getKK0351Current(opSvcKeiNo, JKKModelCommon.getOpeDate(inMsg));

		// ANK-3484-00-00 ADD START
		// オプションサービスコードを比較し、ＰＣプランの場合はチェックしない
		if (OP_SVC_CD_B133.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}
		// ANK-3484-00-00 ADD END
		// サブオプションサービス契約ステータスとオプションサービス契約ステータスを比較し、一致しない場合はエラー
		if (!inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT).equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
		{
			return false;
		}

		return true;
	}
	// IT1-2018-0000186 ADD START
	/**
	 * <p>
	 * 該当のサブオプションサービス契約のサービスコードをチェックする。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true:契約状態が同一である場合、false:それ以外の場合
	 */
	public boolean isChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, inMsg.getString(EKK0401C170CBSMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inMsg.getString(EKK0401C170CBSMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg ret0401 = findByCurrent(inETMsg);
		
		// 検索結果がnullだった場合はtrueを返却
		if (ret0401 == null)
		{
			return true;
		}

		// カレントのサブオプションがPCワイドプランの場合はfalseを返却する
		if (SBOP_SVC_CD_D12.equals(ret0401.getString(KK0401ETMsg.SBOP_SVC_CD)))
		{
			return false;
		}

		return true;
	}
	// IT1-2018-0000186 ADD END
}
