/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0351KRCK
*   ソースファイル名：JKKejbKK0351KRCK.java
*   作成者          ：富士通
*   日付            ：2011年04月21日
*＜機能概要＞
*   オプションサービス契約の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/04/21  富士通      新規作成
*	v4.00.00	2013/01/23	FJ)藤本	    ST1-2012-0000846
*	v4.00.01	2013/01/30	FJ)坂本		IT1-2013-0000167
*	ｖ4.00.02	2013/02/01	FJ)沖田 	IT1-2013-0000186
*   v4.00.03	2013/02/05	FJ)坂本		ST4-2012-0000263
*	v4.00.04	2013/02/08	FJ)藤本		IT1-2013-0000148
*	v4.00.05	2013/02/19	FJ)藤本		OT-2013-0000132
*	v4.00.06	2013/03/26	FJ)阿部		IT1-2013-0000572
*	v4.00.07	2013/05/17	FJ)寺園		ANK-1521-00-00
*	v4.00.08	2013/05/27	FJ)沖田		IT1-2013-0001236
*	v5.00.00	2013/06/13	FJ)竹内		KT1-2013-0000668  
*	v5.00.01	2013/08/25	FJ)沖田		OM-2013-0000877
*	v5.00.01	2013/08/25	FJ)沖田		OM-2013-0002398
*	v7.00.01	2014/01/23	FJ)大山		IT1-2014-0000037
*   v8.00.00    2014/03/13  FJ)寺園     ANK-1855-00-00
*   v8.00.01    2014/04/24  FJ)小島     OM-2014-0001558
*  v11.00.00    2014/11/10  FJ)伊藤     ANK-2184-00-00
*  v22.00.00    2016/02/09  FJ)松岡     OM-2016-0000143
*  v39.00.00	2018/10/12	FJ)山地		ANK-3484-00-00 端末補償サービス導入対応
*  v39.00.01	2018/10/12	FJ)山地		IT1-2018-0000186 PCワイドプランの前月末解約対応
*  v40.00.00	2018/11/08	FJ)舘山		ANK-3412-00-00 ５ギガ・１０ギガコース導入対応
**********************************************************************/

package eo.ejb.common.entity;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANException;
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.common.util.JPCDateUtil;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK0021ETMsg;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0251ETMsg;
import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0351LE;
import eo.ejb.cbm.entity.KK0361ETMsg;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0811ETMsg;
import eo.ejb.cbm.entity.KK0821ETMsg;
import eo.ejb.cbm.entity.KK1631ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1881ETMsg;
import eo.ejb.cbm.entity.KK1881LE;
import eo.ejb.cbm.entity.KK2101ETMsg;
import eo.ejb.cbm.entity.KK2541ETMsg;
import eo.ejb.cbm.entity.ZM0331ETMsg;
import eo.ejb.cbm.entity.ZM0331LE;
import eo.ejb.cbm.entity.ZM0341ETMsg;
import eo.ejb.cbm.entity.ZM0341LE;
import eo.ejb.cbm.entity.ZM0481ETMsg;
import eo.ejb.cbm.entity.ZM0481LE;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.JKKejbBusinessException;
import eo.ejb.common.JKKejbCallTypeChecker;
import eo.ejb.common.db.JKKejbKK0021DBABase;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0161DBABase;
import eo.ejb.common.db.JKKejbKK0341DBABase;
import eo.ejb.common.db.JKKejbKK0351DBABase;
import eo.ejb.common.db.JKKejbKK0361DBABase;
import eo.ejb.common.db.JKKejbKK0401DBABase;
import eo.ejb.common.db.JKKejbKK0811DBABase;
import eo.ejb.common.db.JKKejbKK0821DBABase;
import eo.ejb.common.db.JKKejbKK1681DBABase;
import eo.ejb.common.db.JKKejbKK2101DBABase;
import eo.ejb.common.db.JKKejbShosaChkBase;
import eo.ejb.common.db.JKKejbZM0321DBAccess;

/**
 * <p>
 * オプションサービス契約の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0351KRCK extends JKKejbKK0351DBABase
{

	/** 無効フラグ（有効） */
	private static final String MK_FLG_YUKO = "0";
	
	/** オプションサービスコード（Ｅメール） */
	private static final String OP_SVC_CD_EML = "B001";

	/** オプションサービスコード（Ｍｙホームページ） */
	private static final String OP_SVC_CD_MHP = "B002";

	/** オプションサービスコード（固定グローバルＩＰアドレス） */
	private static final String OP_SVC_CD_KIA = "B004";

	/** オプションサービスコード（ケーブルガイド誌） */
	private static final String OP_SVC_CD_CGS = "B068";
	
	/** オプションサービスコード（ＩＰｖ６アドレス） */
	private static final String OP_SVC_IPV6_AD = "B070";

	/** 異動区分(オプション設定) */
	private static final String IDO_DIV_OPSET = "00031";

	/** 異動予約詳細コード（オプション開始） */
	private static final String IDO_RSV_DTL_OP_STA = "014";

	/** 異動予約詳細コード（オプション引継） */
	private static final String IDO_RSV_DTL_OP_SUCS = "015";

	/** 異動予約詳細コード（オプション解約） */
	private static final String IDO_RSV_DTL_OP_DSL = "016";

	/** 業務パラメータ（ダイアルパッドIDドメイン） */
	private static final String WORK_PARAM_CHGMLAD_FAIL_PRD = "FU_CHGMLAD_FAIL_PRD";

	/** サブオプションサービスコード（メール容量追加） */
	private static final String SBOP_SVC_CD_ML = "D02";

	/** サブオプションサービスコード（ホームページ容量追加） */
	private static final String SBOP_SVC_CD_HP = "D04";
	
	// IT1-2018-0000186 ADD START
	/** ＰＣプラン */
	private static final String OP_SVC_CD_B133 = "B133";
	// IT1-2018-0000186 ADD END

	/** NGワードコード（メールアドレス） */
	private static final String NG_WORD_CD_MLAD = "02";

	/** NGワードコード（ＵＲＬ） */
	private static final String NG_WORD_CD_URL = "03";

	/** 料金コース変更可能機能識別コード（Webのみ） */
	private static final String PCRS_KINO_SKBT_WEB = "1";

	/** 料金コース変更可能機能識別コード（業務端末のみ） */
	private static final String PCRS_KINO_SKBT_WORK = "2";

	/** 申込形態コード（WEB） */
	private static final String MSKM_FORM_CD_WEB = "01";

	/** オプションサービス契約_異動予約取得項目（異動予約詳細コード） **/
	private static final String SEL_OPIDO_IDO_DTL = "IDO_RSV_DTL_CD";
	
	/** オプションサービス契約_異動予約取得項目（予約適用年月日） **/
	private static final String SEL_RSV_APLY_YMD = "RSV_APLY_YMD";
	
	/** 親契約識別コード(サービス契約) */
	private static final String OYA_KEI_SKBT_CD_SVC_KEI = "01";

	/** 親契約識別コード(サービス契約内訳) */
	private static final String OYA_KEI_SKBT_CD_SVC_KEI_UCWK = "03";

	/** サービス解約理由コード（引継解約） */
	private static final String SVC_DLRE_CD_KAI_OVER = "04";

	/** サービスコード(電話サービス) */
	private static final String SVC_CD_TEL = "02";

	/** サービスコード(テレビサービス) */
	private static final String SVC_CD_TV = "03";
	
	/** 同日指定：含む */
	private static final String INC_DATE = "1";
	
	/** 同日指定：含まない */
	private static final String NO_INC_DATE = "0";
	
	/** サブオプションサービス契約回復不可・オプションサービス契約ステータス："休止・中断中"、"停止中"、"解約済"、"キャンセル済" */
	private static final ArrayList<String> SBOP_KAIHK_NG_OPSVKEI_STAT_LIST = new ArrayList<String>();
	static
	{
		SBOP_KAIHK_NG_OPSVKEI_STAT_LIST.add(JKKModelConst.SVC_KEI_STAT_PAUSE_STP_CHU);
		SBOP_KAIHK_NG_OPSVKEI_STAT_LIST.add(JKKModelConst.SVC_KEI_STAT_STP_CHU);
		SBOP_KAIHK_NG_OPSVKEI_STAT_LIST.add(JKKModelConst.SVC_KEI_STAT_DSL_ZM);
		SBOP_KAIHK_NG_OPSVKEI_STAT_LIST.add(JKKModelConst.SVC_KEI_STAT_CNCL_ZM);
	}
	
	/**
	 * <p>
	 * 新しいJKKejbKK0351KRCKを作成します。
	 * </p>
	 */
	public JKKejbKK0351KRCK()
	{
		super();
	}

	/**
	 * <p>
	 * オプションサービス契約の存在チェックを行います。（世代登録年月日時分秒を除く有効なレコード）
	 * </p>
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExistsNonGene(String opSvcKeiNo)
	{
		if(null == opSvcKeiNo || "".equals(opSvcKeiNo))
		{
			return true;
		}

		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0351ETMsg.class.getName());
		msg.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		msg.set(KK0351ETMsg.MK_FLG, "0");

		// ロジカルエンティティ生成
		KK0351LE le = new KK0351LE();

		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 opSvcKeiNo オプションサービス契約番号
	 * @param svcStaymd  サービス開始年月日
	 * @return サービス開始年月日の入力がある場合または
	 *          オプションサービスコードが「ケーブルガイド誌」以外の場合はtrue。
	 *          サービス開始年月日の入力がない場合かつ
	 *          オプションサービスコードが「ケーブルガイド誌」の場合はfalse。
	 */
	public boolean isCheckSvcStaymd(CAANMsg inMsg, String opSvcKeiNo, String svcStaymd)
	{
		// オプションサービス契約番号が設定されている場合は処理を行う
		if (null == opSvcKeiNo)
		{
			return true;
		}
		// サービス開始年月日が設定されていない場合は処理を行う
		if (null != svcStaymd)
		{
			return true;
		}
		
		// カレント検索用のメッセージを作成
		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 ret0351 = new JKKejbKK0351DBABase().findByCurrent(inETMsg);

		// 検索結果がnullだった場合はfalseを返却
		if (ret0351 == null)
		{
			return false;
		}

		// 検索結果のオプションサービスコードが"B068"（ケーブルガイド誌）の場合はfalseを返却
		if (OP_SVC_CD_CGS.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return false;
		}
		return true;
	}

	/**
	 * <p>
	 * ダイヤルアップ接続当月プラン変更済みチェックを行います
	 * </p>
	 * @param inMsg     処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true：チェックOK  false：チェックNG
	 */
	public boolean isConPremonPlanZumi(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// オプションサービス契約番号が設定されていない場合
		if (inMsg.isNull(KK0351ETMsg.OP_SVC_KEI_NO))
		{
			return true;
		}

		// オプションサービス番号を取得する
		String optSvcKeiNo = inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
		
		// オプションサービス契約番号をキーにオプションサービス契約から申込明細番号を取得する
		String msMesaiNo = this.getMoushikomiMeisaiNo(inMsg, inContext, optSvcKeiNo);
		
		// 申込明細番号が未設定の場合
		if (msMesaiNo == null)
		{
			return true;
		}
		
		// 申込明細番号をキーに申込明細から申込年月日を取得する
		String msYmd = this.getMoushikomiYmd(inMsg, inContext, msMesaiNo);

		// 申込年月日が未設定の場合
		if (msYmd == null)
		{
			return true;
		}
		
		// 申込年月日の「年月」と運用日付の「年月」を取得する
		String msTm = msYmd.substring(0, 6);
		String opeYm = JKKModelCommon.getOpeDate(inMsg).substring(0, 6);
		
		// 申込年月日の年月と運用日付の年月が同一月か？
		if (msTm.equals(opeYm))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * オプションサービス契約番号をキーにオプションサービス契約から申込明細番号を取得します
	 * </p>
	 * @param inMsg       処理対象のメッセージキャリア
	 * @param inContext   Agentから渡されたAgentDispatchContext
	 * @param optSvcKeiNo サービスオプション契約番号
	 * @return 申込明細番号
	 */
	private String getMoushikomiMeisaiNo(CAANMsg inMsg, AgentDispatchContext inContext, String optSvcKeiNo)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			//コネクション取得
			con = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT ");
			sql_Buff.append("    KK0351.MSKM_DTL_NO ");
			sql_Buff.append("FROM ");
			sql_Buff.append("    KK_T_OP_SVC_KEI KK0351 ");
			sql_Buff.append("WHERE ");
			sql_Buff.append("    KK0351.OP_SVC_KEI_NO = ? ");
			sql_Buff.append("    AND KK0351.IDO_DIV = '00031' ");
			sql_Buff.append("    AND KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM = ");
			sql_Buff.append("        (SELECT 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.RSV_APLY_YMD <= ? ");
			sql_Buff.append("         AND    KK0351_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("         AND    KK0351_GENE.MK_FLG= '0') ");

			//prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(オプションサービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, optSvcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 返却用
			String retMkMesiNo = null;

			// 取得結果の設定
			if (rsltQuery.next())
			{
				// 申込明細番号を取得
				retMkMesiNo = rsltQuery.getString(1);
			}

			return retMkMesiNo;
		}
		catch (SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch (SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}

	/**
	 * <p>
	 * 申込明細番号をキーに申込明細から申込年月日を取得します
	 * </p>
	 * @param inMsg     処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param msMesaiNo 申込明細番号
	 * @return 申込年月日
	 */
	private String getMoushikomiYmd(CAANMsg inMsg, AgentDispatchContext inContext, String msMesaiNo)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			//コネクション取得
			con = JSYejbConnection.getConnection(KK0021ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT ");
			sql_Buff.append("    KK0021.MSKM_YMD ");
			sql_Buff.append("FROM ");
			sql_Buff.append("    KK_T_MSKM_DTL KK0021 ");
			sql_Buff.append("WHERE ");
			sql_Buff.append("    KK0021.MSKM_DTL_NO = ? ");
			sql_Buff.append("    AND (KK0021.MSKM_DTL_NO, KK0021.GENE_ADD_DTM) = ");
			sql_Buff.append("        (SELECT KK0021_GENE.MSKM_DTL_NO, MAX(KK0021_GENE.GENE_ADD_DTM) AS KK0021_MAX ");
			sql_Buff.append("         FROM   KK_T_MSKM_DTL KK0021_GENE ");
			sql_Buff.append("         WHERE  KK0021_GENE.MSKM_DTL_NO = KK0021.MSKM_DTL_NO ");
			sql_Buff.append("         AND    KK0021_GENE.MK_FLG= '0' ");
			sql_Buff.append("         GROUP BY KK0021_GENE.MSKM_DTL_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(申込明細番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, msMesaiNo);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 返却用
			String retMkYmd = null;

			// 取得結果の設定
			if (rsltQuery.next())
			{
				// 申込年月日を取得
				retMkYmd = rsltQuery.getString(1);
			}

			return retMkYmd;
		}
		catch (SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch (SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}
	
	/**
	 * <p>isDslRsvSvcKeiNo
	 * 同一サービス契約に紐付くオプションサービス契約の申込予約チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcCd 対象のオプションサービスコード
	 * @return 同一サービス契約番号に紐付く申込予約レコードが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isAddRsvSvcKeiNo(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcCd)
	{
		// サービス契約番号を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);
		
		// サービス契約番号が設定されていない場合
		if (null == svcKeiNo)
		{
			return true;
		}
		
		// サービス契約番号に紐付くオプションサービス契約の予約を取得
		ArrayList<HashMap<String, String>> retKK0351
			= new JKKejbKRCKCommon().getRsvOpIdoWithSvc(inMsg, inContext, svcKeiNo, opSvcCd.toString());

		for (int i = 0; i < retKK0351.size(); i++)
		{
			HashMap<String, String> hash = retKK0351.get(i);
			
			// 「異動予約詳細コード」が
			// "014"（オプション開始）、"015"（オプション引継）いずれかである場合、falseを返却する
			if (IDO_RSV_DTL_OP_STA.equals(hash.get(SEL_OPIDO_IDO_DTL))
					|| IDO_RSV_DTL_OP_SUCS.equals(hash.get(SEL_OPIDO_IDO_DTL))) 
			{
				return false;
			}
		}

		// 対象の予約が存在しなかった場合はtrueを返却する
		return true;
	}
	
	/**
	 * <p>
	 * 同一サービス契約番号に紐付くオプションサービス契約の申込予約チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcCd 対象のオプションサービスコード
	 * @return 同一サービス契約内訳番号に紐付く申込予約レコードが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isAddRsvSvcKeiUcwkNo(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcCd)
	{
		
		// サービス契約内訳番号に紐付くオプションサービス契約の予約を取得
		ArrayList<HashMap<String, String>> retKK0351
			= new JKKejbKRCKCommon().getRsvOpIdoWithSvcUcwk(inMsg, inContext, inMsg.getString(KK0351ETMsg.SVC_KEI_UCWK_NO), opSvcCd.toString());

		for (int i = 0; i < retKK0351.size(); i++)
		{
			HashMap<String, String> hash = retKK0351.get(i);
			
			// 「異動予約詳細コード」が
			// "014"（オプション開始）、"015"（オプション引継）いずれかである場合、falseを返却する
			if (IDO_RSV_DTL_OP_STA.equals(hash.get(SEL_OPIDO_IDO_DTL))
					|| IDO_RSV_DTL_OP_SUCS.equals(hash.get(SEL_OPIDO_IDO_DTL))) 
			{
				return false;
			}
		}

		// 対象の予約が存在しなかった場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * 同一サービス契約に紐付くオプションサービス契約の解約予約チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcCd 対象のオプションサービスコード
	 * @return 同一サービス契約番号に紐付く解約予約レコードが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isDslRsvSvcKeiNo(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcCd)
	{
		// サービス契約番号を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);
		
		// サービス契約番号が設定されていない場合
		if (null == svcKeiNo)
		{
			return true;
		}
		
		// サービス契約番号に紐付くオプションサービス契約の予約を取得
		ArrayList<HashMap<String, String>> retKK0351
			= new JKKejbKRCKCommon().getRsvOpIdoWithSvc(inMsg, inContext, svcKeiNo, opSvcCd.toString());

		for (int i = 0; i < retKK0351.size(); i++)
		{
			HashMap<String, String> hash = retKK0351.get(i);
			
			// 「異動予約詳細コード」が
			// "016"（オプション解約）である場合、falseを返却する
			if (IDO_RSV_DTL_OP_DSL.equals(hash.get(SEL_OPIDO_IDO_DTL))) 
			{
				return false;
			}
		}

		// 対象の予約が存在しなかった場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * 同一サービス契約内訳番号に紐付くオプションサービス契約の解約予約チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcCd 対象のオプションサービスコード
	 * @return 同一サービス契約内訳番号に紐付く解約予約レコードが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isDslRsvSvcKeiUcwkNo(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcCd)
	{
		
		// サービス契約内訳番号に紐付くオプションサービス契約の予約を取得
		ArrayList<HashMap<String, String>> retKK0351
			= new JKKejbKRCKCommon().getRsvOpIdoWithSvcUcwk(inMsg, inContext, inMsg.getString(KK0351ETMsg.SVC_KEI_UCWK_NO), opSvcCd.toString());

		for (int i = 0; i < retKK0351.size(); i++)
		{
			HashMap<String, String> hash = retKK0351.get(i);
			
			// 「異動予約詳細コード」が
			// "016"（オプション解約）である場合、falseを返却する
			if (IDO_RSV_DTL_OP_DSL.equals(hash.get(SEL_OPIDO_IDO_DTL))) 
			{
				return false;
			}
		}

		// 対象の予約が存在しなかった場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * 同一オプションサービス契約番号に紐付くの解約予約チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcCd 対象のオプションサービスコード
	 * @return 解約予約レコードが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isDslRsv(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// オプションサービス契約番号に紐付く異動予約の予約を取得
		List<CAANMsg> retKK0351 = new JKKejbIdoRsvAccess().getIdoRsvOpSvcKeiNo(inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO), JKKModelCommon
				.getOpeDate(inMsg));

		for (int i = 0; i < retKK0351.size(); i++)
		{
			CAANMsg retMsg = retKK0351.get(i);

			// 「異動予約詳細コード」が
			// "016"（オプション解約）である場合、falseを返却する
			if (IDO_RSV_DTL_OP_DSL.equals(retMsg.getString(KK1681ETMsg.IDO_RSV_DTL_CD))) 
			{
				return false;
			}
		}

		// 対象の予約が存在しなかった場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * オプションサービス契約の契約チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcCd 対象のオプションサービスコード
	 * @return 同一サービス契約番号に紐付く契約レコードが存在しないる場合はtrue。存在する場合はfalse。
	 */
	public boolean isExistKei(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcCd)
	{
		// サービス契約番号を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);
		
		// サービス契約番号が設定されていない場合
		if (null == svcKeiNo)
		{
			return true;
		}
		
		// オプションサービス契約の対象データ件数を取得
		long lDataCnt = getCountKK0351(inMsg, inContext, svcKeiNo, opSvcCd);

		// 対象のデータが0件の場合はtrueを返却する
		if (lDataCnt == 0)
		{
			return true;
		}

		// それ以外の場合はfalseを返却する
		return false;
	}

	/**
	 * <p>
	 * 紐付く工事の状態チェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return サービス契約に未完了の工事が存在し、ISP認証IDに変更が発生している場合はfalse。それ以外の場合はfalse。
	 */
	public boolean isKojiStatus(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// サービス契約番号を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);
		
		// サービス契約番号が設定されていない場合
		if (null == svcKeiNo)
		{
			return true;
		}
		
		// 工事中工事案件取得処理を呼び出し、結果がtrueの場合はtrueを返却する
		JKKejbKRCKCommon krckc = new JKKejbKRCKCommon();

		if (krckc.isNotExistKoujiNotFin(inMsg, inContext, svcKeiNo)) 
		{
			return true;
		}

		// サービス契約内訳件数取得を行う
		long lDataCnt = getCountKK0161(inMsg, inContext, svcKeiNo);

		// 対象のデータが2件以上の場合はfalseを返却する
		if (lDataCnt >= 2)
		{
			return false;
		}

		return true;
	}
	
	/**
	 * <p>
	 * 同一サービス契約に紐付くオプションサービス契約の申込予約チェックを行います。(後続予約)
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcCd 対象のオプションサービスコード
	 * @param svcEndYmd 対象のサービス終了年月日
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return 同一サービス契約番号に紐付く申込予約レコードが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isAddRsvSvcKeiNoKouzoku(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcCd, Object svcEndYmd, Object opSvcKeiNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}
		
		// オプションサービスコードが"固定グローバルIPアドレス"以外の場合
		if (!OP_SVC_CD_KIA.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}
		
		// サービス契約内訳番号が未設定の場合
		if (ret0351.isNull(KK0351ETMsg.SVC_KEI_UCWK_NO))
		{
			return true;
		}
		
		// サービス契約番号に紐付くオプションサービス契約の予約を取得
		ArrayList<HashMap<String, String>> retKK0351 
			= new JKKejbKRCKCommon().getRsvOpIdoWithSvcUcwk(inMsg, inContext, ret0351.getString(KK0351ETMsg.SVC_KEI_UCWK_NO), opSvcCd);

		for (int i = 0; i < retKK0351.size(); i++)
		{
			HashMap<String, String> hash = retKK0351.get(i);

			// 「異動予約詳細コード」が
			// "014"（オプション開始）、"015"（オプション引継）いずれかである場合
			if (IDO_RSV_DTL_OP_STA.equals(hash.get(SEL_OPIDO_IDO_DTL)) 
					|| IDO_RSV_DTL_OP_SUCS.equals(hash.get(SEL_OPIDO_IDO_DTL)))
			{
				// 異動予約.予約適用年月日 < 入力.サービス終了年月日の場合
				if (hash.get(SEL_RSV_APLY_YMD).compareTo((String)svcEndYmd) <= 0)
				{
					return false;
				}
			}
		}

		// 対象の予約が存在しなかった場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * 同一サービス契約に紐付くオプションサービス契約の申込予約チェックを行います。(先行予約)
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcCd 対象のオプションサービスコード
 	 * @param svcEndYmd 対象のサービス終了年月日
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return 同一サービス契約番号に紐付く申込予約レコードが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isAddRsvSvcKeiNoSenkou(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcCd, Object svcEndYmd, Object opSvcKeiNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}
		
		// オプションサービスコードが"固定グローバルIPアドレス"以外の場合
		if (!OP_SVC_CD_KIA.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}
		
		// サービス契約内訳番号が未設定の場合
		if (ret0351.isNull(KK0351ETMsg.SVC_KEI_UCWK_NO))
		{
			return true;
		}

		// サービス契約番号に紐付くオプションサービス契約の予約を取得
		ArrayList<HashMap<String, String>> retKK0351
			= new JKKejbKRCKCommon().getRsvOpIdoWithSvcUcwk(inMsg, inContext, ret0351.getString(KK0351ETMsg.SVC_KEI_UCWK_NO), opSvcCd);

		for (int i = 0; i < retKK0351.size(); i++)
		{
			HashMap<String, String> hash = retKK0351.get(i);

			// 「異動予約詳細コード」が
			// "016"（オプション解約）である場合
			if (IDO_RSV_DTL_OP_DSL.equals(hash.get(SEL_OPIDO_IDO_DTL)))
			{
				// 異動予約.予約適用年月日 > 入力.サービス終了年月日の場合
				if (hash.get(SEL_RSV_APLY_YMD).compareTo((String)svcEndYmd) >= 0)
				{
					return false;
				}
			}
		}

		// 対象の予約が存在しなかった場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * メールアドレスの変更不可期間を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 変更不可期間外の場合はtrue、期間内の場合はfalse。
	 */
	public boolean isNotChangePrdMlad(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		
		// 呼び出し元がフロント以外の場合はtrueを返却する
		if(!JKKejbCallTypeChecker.isCallTypeFront(inContext)) {
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = super.findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのオプションサービスコードが"B001"(Ｅメール)以外の場合はtrueを返却する
		if (!OP_SVC_CD_EML.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0361 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0361.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));

		// オプションサービス契約<ISP>のカレント検索を行う
		CAANMsg ret0361 = new JKKejbKK0361DBABase().findByCurrent(inETMsgKK0361);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0361 == null)
		{
			return true;
		}

		// 全てのメールアカウントの値がカレントレコードの同項目と等しい場合はtrueを返却する

		boolean setVl_flg1 = compareValue(ret0361.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_1), inMsg.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_1));
		boolean setVl_flg2 = compareValue(ret0361.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_2), inMsg.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_2));
		boolean setVl_flg3 = compareValue(ret0361.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_3), inMsg.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_3));

		if (setVl_flg1 && setVl_flg2 && setVl_flg3)
		{
			return true;
		}

		// 業務パラメータより業務パラメータ設定値を取得
		JKKejbZM0321DBAccess jKKejbZM0321DBAccessIns = new JKKejbZM0321DBAccess();
		String value = jKKejbZM0321DBAccessIns.getParamE(WORK_PARAM_CHGMLAD_FAIL_PRD);

		// カレントレコードの「メールアドレス変更年月日」がnullだった場合はtrueを返却
		if (ret0361.isNull(KK0361ETMsg.MLAD_CHGE_YMD))
		{
			return true;
		}

		// カレントレコードの「メールアドレス変更年月日」と業務パラメータ設定値を足して日付を編集する
		String yyyymmdd = JPCDateUtil.addDay(ret0361.getString(KK0361ETMsg.MLAD_CHGE_YMD), Integer.parseInt(value));

		// 運用日が変更不可期間内の場合はtrueを返却
		if (JKKModelCommon.getOpeDate(inMsg).compareTo(yyyymmdd) < 0)
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 容量の上限値のチェックを行います。（Eメール）
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 指定された容量が上限値を超えている場合はtrue。超えていない場合はfalse。
	 */
	public boolean isNotOverLimitCapaEmail(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 容量が未入力の場合はチェックを行わない
		if (inMsg.isNull(KK0361ETMsg.CAPA))
		{
			return true;
		}

		// オプションサービス契約検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = new JKKejbKK0351DBABase().findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// サービス契約検索用のメッセージを作成
		CAANMsg inETMsgKK0081 = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsgKK0081.set(KK0081ETMsg.SVC_KEI_NO, ret0351.getString(KK0081ETMsg.SVC_KEI_NO));
		inETMsgKK0081.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サービス契約のカレント検索を行う
		CAANMsg ret0081 = new JKKejbKK0081DBABase().findByCurrent(inETMsgKK0081);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0081 == null)
		{
			return true;
		}

		// サービス契約の料金コースコードがnullだった場合はtrueを返却
		if (ret0081.isNull(KK0081ETMsg.PCRS_CD))
		{
			return true;
		}

		// オプションサービス契約のオプションサービスコードが"B001"(Ｅメール)でない場合はtrueを返却する
		String sbopSvcCd = "";

		if (OP_SVC_CD_EML.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			sbopSvcCd = SBOP_SVC_CD_ML;
		}
		else
		{
			return true;
		}

		// プライマリ検索用のメッセージを作成
		CAANMsg inETMsgKK1881 = new CAANMsg(KK1881ETMsg.class.getName());
		inETMsgKK1881.set(KK1881ETMsg.PCRS_CD, ret0081.getString(KK0081ETMsg.PCRS_CD));
		inETMsgKK1881.set(KK1881ETMsg.SBOP_SVC_CD, sbopSvcCd);

		// 料金コース_サブオプションサービスのプライマリ検索を行う
		CAANMsg ret1881 = new KK1881LE().findByPrimaryKey(inETMsgKK1881);

		// 検索結果がnullだった場合はtrueを返却
		if (ret1881 == null)
		{
			return true;
		}

		// プライマリレコードの「サービス提供物最大値」が「容量」より小さい場合はfalseを返却する
		// 上記以外の場合はtrueを返却する
		int maxVl = Integer.parseInt(ret1881.getString(KK1881ETMsg.SVCTK_BUT_MAX_VALUE));
		int capa = Integer.parseInt(inMsg.getString(KK0361ETMsg.CAPA));

		if (maxVl < capa)
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 容量の上限値のチェックを行います。（Myホームページ）
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 指定された容量が上限値を超えている場合はtrue。超えていない場合はfalse。
	 */
	public boolean isNotOverLimitCapaMhp(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 容量が未入力の場合はチェックを行わない
		if (inMsg.isNull(KK0361ETMsg.CAPA))
		{
			return true;
		}

		// オプションサービス契約検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = new JKKejbKK0351DBABase().findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// サービス契約検索用のメッセージを作成
		CAANMsg inETMsgKK0081 = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsgKK0081.set(KK0081ETMsg.SVC_KEI_NO, ret0351.getString(KK0081ETMsg.SVC_KEI_NO));
		inETMsgKK0081.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サービス契約のカレント検索を行う
		CAANMsg ret0081 = new JKKejbKK0081DBABase().findByCurrent(inETMsgKK0081);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0081 == null)
		{
			return true;
		}

		// サービス契約の料金コースコードがnullだった場合はtrueを返却
		if (ret0081.isNull(KK0081ETMsg.PCRS_CD))
		{
			return true;
		}

		// オプションサービス契約のオプションサービスコードが"B002"（Ｍｙホームページ）でない場合はtrueを返却する
		String sbopSvcCd = "";

		if (OP_SVC_CD_MHP.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			sbopSvcCd = SBOP_SVC_CD_HP;
		}
		else
		{
			return true;
		}

		// プライマリ検索用のメッセージを作成
		CAANMsg inETMsgKK1881 = new CAANMsg(KK1881ETMsg.class.getName());
		inETMsgKK1881.set(KK1881ETMsg.PCRS_CD, ret0081.getString(KK0081ETMsg.PCRS_CD));
		inETMsgKK1881.set(KK1881ETMsg.SBOP_SVC_CD, sbopSvcCd);

		// 料金コース_サブオプションサービスのプライマリ検索を行う
		CAANMsg ret1881 = new KK1881LE().findByPrimaryKey(inETMsgKK1881);

		// 検索結果がnullだった場合はtrueを返却
		if (ret1881 == null)
		{
			return true;
		}

		// プライマリレコードの「サービス提供物最大値」が「容量」より小さい場合はfalseを返却する
		// 上記以外の場合はtrueを返却する
		int maxVl = Integer.parseInt(ret1881.getString(KK1881ETMsg.SVCTK_BUT_MAX_VALUE));
		int capa = Integer.parseInt(inMsg.getString(KK0361ETMsg.CAPA));

		if (maxVl < capa)
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * メールアドレスの必須チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return メールアドレスがNullでない場合はtrue。Nullである場合はfalse。
	 */
	public boolean isNotNullMlad(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// カレントレコードが取得できなかった場合は処理を行わない
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのオプションサービスコードが"B001"(Ｅメール)以外の場合はtrueを返却する
		if (!OP_SVC_CD_EML.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}

		// オプションサービス契約ステータスが"受付済"の場合は、チェック対象外
		if (JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(ret0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
		{
			return true;
		}

		// 「メールアドレス」がnullの場合はfalseを返却する
		if (inMsg.isNull(KK0361ETMsg.MLAD))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 容量の必須チェックを行います。（Eメール）
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 容量がNullでない場合はtrue。Nullである場合はfalse。
	 */
	public boolean isNotNullCapaEmail(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのオプションサービスコードが"B001"(Ｅメール)でない場合はtrueを返却する
		if (!OP_SVC_CD_EML.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}

		// オプションサービス契約ステータスが"受付済"の場合は、チェック対象外
		if (JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(ret0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
		{
			return true;
		}

		// 「容量」がnullの場合はfalseを返却する
		if (inMsg.isNull(KK0361ETMsg.CAPA))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 容量の必須チェックを行います。（Myホームページ）
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 容量がNullでない場合はtrue。Nullである場合はfalse。
	 */
	public boolean isNotNullCapaMhp(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのオプションサービスコードが"B002"（Ｍｙホームページ）でない場合はtrueを返却する
		if (!OP_SVC_CD_MHP.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}

		// オプションサービス契約ステータスが"受付済"の場合は、チェック対象外
		if (JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(ret0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
		{
			return true;
		}

		// 「容量」がnullの場合はfalseを返却する
		if (inMsg.isNull(KK0361ETMsg.CAPA))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 希望メールアカウント1が変更される場合のNGワードチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 変更する希望メールアカウント1がNGワードに存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isNotNgCngAccount1(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 希望メールアカウントNGワードの共通処理を呼び出す
		return isNotNgCngAccount(inMsg, inContext, KK0361ETMsg.KIBO_ML_ACCOUNT_1);
	}

	/**
	 * <p>
	 * 希望メールアカウント2が変更される場合のNGワードチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 変更する希望メールアカウント2がNGワードに存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isNotNgCngAccount2(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 希望メールアカウントNGワードの共通処理を呼び出す
		return isNotNgCngAccount(inMsg, inContext, KK0361ETMsg.KIBO_ML_ACCOUNT_2);
	}

	/**
	 * <p>
	 * 希望メールアカウント3が変更される場合のNGワードチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 変更する希望メールアカウント3がNGワードに存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isNotNgCngAccount3(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 希望メールアカウントNGワードの共通処理を呼び出す
		return isNotNgCngAccount(inMsg, inContext, KK0361ETMsg.KIBO_ML_ACCOUNT_3);
	}

	/**
	 * <p>
	 * URL（ドメイン）、URL（アカウント）が変更される場合のNGワードチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 変更するURL（アカウント）がNGワードに存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isNotNgCngUrl(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 「URL(ドメイン)」が未入力の場合はチェックを行わない
		if (inMsg.isNull(KK0361ETMsg.URL_DOMAIN))
		{
			return true;
		}

		// 「URL(アカウント)」が未入力の場合はチェックを行わない
		if (inMsg.isNull(KK0361ETMsg.URL_ACCOUNT))
		{
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのオプションサービスコードが"B002"（MYホームページ）以外の場合はtrueを返却する
		if (!OP_SVC_CD_MHP.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
		inETMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));

		// オプションサービス契約<ISP>のカレント検索を行う
		CAANMsg ret0361 = new JKKejbKK0361DBABase().findByCurrent(inETMsgKK0361);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0361 == null)
		{
			return true;
		}

		// 変更前と変更後のURL（ドメイン）とURL（アカウント）がそれぞれ一致する場合はtrueを返却する
		if (compareValue(inMsg.getString(KK0361ETMsg.URL_DOMAIN), ret0361.getString(KK0361ETMsg.URL_DOMAIN))
				&& compareValue(inMsg.getString(KK0361ETMsg.URL_ACCOUNT), ret0361.getString(KK0361ETMsg.URL_ACCOUNT)))
		{
			return true;
		}

		// NGワードチェック処理を呼び出す
		JKKejbKRCKCommon krckc = new JKKejbKRCKCommon();
		return krckc.isNotExistsNg(inMsg, inContext, NG_WORD_CD_URL, inMsg.getString(KK0361ETMsg.URL_ACCOUNT));
	}

	/**
	 * <p>
	 * IF項目の料金コース、料金プランが現在契約中の料金コース、料金プランと同一かチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 指定された料金プランコード、料金コースコードの両方がカレントレコードと一致しない場合はtrue。
	 *          一致する場合はfalse。
	 */
	public boolean isPcrsPplanSameCheck(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はfalseを返却
		if (ret0351 == null)
		{
			return false;
		}

		// カレントレコードと処理対象メッセージの料金コースコードと料金プランコードがそれぞれ一致する場合はfalseを返却する
		if (ret0351.getString(KK0351ETMsg.PCRS_CD).equals(inMsg.getString(KK0351ETMsg.PCRS_CD))
				&& ret0351.getString(KK0351ETMsg.PPLAN_CD).equals(inMsg.getString(KK0351ETMsg.PPLAN_CD)))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 料金コース変更可能条件のチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return "変更前料金コースコード"、"変更後料金コースコード" で、料金コース変更可能条件を検索し、
	 *          条件に一致するレコードが存在した場合はtrue。それ以外の場合はfalse。
	 */
	public boolean isPcrsChangeCheck(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はfalseを返却
		if (ret0351 == null)
		{
			return false;
		}

		// 料金コース変更可能条件の取得を行う
		String strkinoCd = getKinoCdKK1631(inMsg, inContext, ret0351.getString(KK0351ETMsg.PCRS_CD), inMsg.getString(KK0351ETMsg.PCRS_CD));

		// 検索結果がnullだった場合はfalseを返却
		if (strkinoCd == null)
		{
			return false;
		}

		// 申込明細番号が設定されていない場合は処理を終了する
		if (inMsg.isNull(KK0351ETMsg.MSKM_DTL_NO))
		{
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0021 = new CAANMsg(KK0021ETMsg.class.getName());
		inETMsgKK0021.set(KK0021ETMsg.MSKM_DTL_NO, inMsg.getString(KK0351ETMsg.MSKM_DTL_NO));

		// 申込明細のカレント検索を行う
		CAANMsg ret0021 = new JKKejbKK0021DBABase().findByCurrent(inETMsgKK0021);

		// 検索結果がnullだった場合はfalseを返却
		if (ret0021 == null)
		{
			return false;
		}

		// 料金コース変更可能機能識別コードが"2"(業務端末のみ)
		// かつ、申込形態コードが"01"(WEB)の場合はfalseを返却する
		if (PCRS_KINO_SKBT_WORK.equals(strkinoCd) 
				&& MSKM_FORM_CD_WEB.equals(ret0021.getString(KK0021ETMsg.MSKM_FORM_CD)))
		{
			return false;
		}

		// 料金コース変更可能機能識別コードが"1"(Webのみ)であること
		// かつ、申込形態コードが"01"(WEB)以外の場合はfalseを返却する
		if (PCRS_KINO_SKBT_WEB.equals(strkinoCd) 
				&& !MSKM_FORM_CD_WEB.equals(ret0021.getString(KK0021ETMsg.MSKM_FORM_CD)))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 同一サービス契約に紐付く、オプションサービス契約<TV>の存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @param opSvcCd オプションサービスコード
	 * @return 指定されたサービス契約番号に紐付くオプションサービス契約のカレントレコードに
	 *          オプションサービス契約ステータスが"サービス提供中"のレコードが存在しない場合true。存在する場合false。
	 */
	public boolean isNotExistOpSvcKeiTv(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo, String opSvcCd)
	{
		// サービス契約番号を取得する
		String oyaSvcKeiNo = getOyaSvcKeiNo(inMsg);
		
		// サービス契約番号が設定されていない場合
		if (null == oyaSvcKeiNo)
		{
			return true;
		}

		// 運用日付を取得
		String sOpeDate = JKKModelCommon.getOpeDate(inMsg);

		// オプションサービス内部スキーマメッセージを作成
		CAANMsg opCurMsg = new CAANMsg(KK0821ETMsg.class.getName());
		opCurMsg.set(KK0821ETMsg.OP_SVC_CD, opSvcCd);
		opCurMsg.set(KK0821ETMsg.RSV_APLY_YMD, sOpeDate);

		// オプションサービスのカレントレコードを取得
		CAANMsg retopCurMsg = new JKKejbKK0821DBABase().findByCurrent(opCurMsg);

		// カレントレコードが取得できた場合
		if (null != retopCurMsg)
		{
			// オプションチャンネル種別コードに値が設定されている場合、true
			// (オプションチャンネルのコードが設定されている場合はチェック不要)
			if (!retopCurMsg.isNull(KK0821ETMsg.OP_CHANNEL_SBT_CD))
			{
				return true;
			}
		}
		
		// オプションサービス契約の対象データ件数を取得
		long lDataCnt = getCountKK0351(inMsg, inContext, oyaSvcKeiNo, opSvcCd);

		// 対象のデータが0件の場合はtrueを返却する
		if (lDataCnt == 0)
		{
			return true;
		}

		// それ以外の場合はfalseを返却する
		return false;
	}

	/**
	 * <p>
	 * オプションサービス契約のIPv6登録チェック（起点変電所コード）を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 親サービス契約がMTグローバルかつ起点変電所コードが未設定のデータが存在する場合はfalse。存在しない場合はtrue。
	 */
	public boolean isIPv6AddKitenChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// フロントからの呼び出し以外の場合はチェックを行わない
		if (!JKKejbCallTypeChecker.isCallTypeFront(inContext))
		{
			return true;
		}
		
		// サービス契約番号を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);

		// サービス契約番号が設定されていない場合はtrueを返却する
		if (null == svcKeiNo)
		{
			return true;
		}

		// HT、MT光配線のデータ件数を取得
		long lDataCnt = new JKKejbKRCKCommon().getHTMTHikari(inMsg, inContext, svcKeiNo);

		// 対象のデータが0件の場合はtrueを返却する
		if (lDataCnt == 0)
		{
			return true;
		}

		// サービス契約番号に紐づくサービス契約回線内訳のデータを取得
		CAANMsg[] retMsgKK0251List = findByKK0251WithSvc(inMsg, inContext, svcKeiNo);

		// 対象のサービス契約回線内訳が存在しない場合はfalseを返却する
		if (1 > retMsgKK0251List.length)
		{
			return false;
		}

		for (CAANMsg retMsgKK0251: retMsgKK0251List)
		{
			// 起点変電所コードが未設定のレコードが存在する場合はfalseを返却する
			if (retMsgKK0251.isNull(KK0251ETMsg.KITEN_HDSHO_CD))
			{
				return false;
			}
		}

		// それ以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * オプションサービス契約のIPv6登録チェック（起点変電所中心局コード）を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 親サービス契約がHT、MT光配線かつ起点変電所コードから中心局コードが取得できない場合はfalse。それ以外の場合はtrue。
	 */
	public boolean isIPv6AddKitenCentChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// サービス契約番号を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);

		// サービス契約番号が設定されていない場合はtrueを返却する
		if (null == svcKeiNo)
		{
			return true;
		}

		// HT、MT光配線のデータ件数を取得
		long lDataCnt = new JKKejbKRCKCommon().getHTMTHikari(inMsg, inContext, svcKeiNo);

		// 対象のデータが0件の場合はtrueを返却する
		if (lDataCnt == 0)
		{
			return true;
		}

		// サービス契約番号に紐づくサービス契約回線内訳のデータを取得
		CAANMsg[] retMsgKK0251List = findByKK0251WithSvc(inMsg, inContext, svcKeiNo);

		// 対象のサービス契約回線内訳が存在しない場合はfalseを返却する
		if (1 > retMsgKK0251List.length)
		{
			return false;
		}

		for (CAANMsg retMsgKK0251: retMsgKK0251List)
		{
			// 起点変電所コードがNullの場合trueを返却する
			if (retMsgKK0251.isNull(KK0251ETMsg.KITEN_HDSHO_CD))
			{
				return true;
			}
			
			// 起点変電所を検索
			CAANMsg retMsgZM0331 = findByZM0331Valid(retMsgKK0251.getString(KK0251ETMsg.KITEN_HDSHO_CD));

			// 起点変電所が取得できない場合はfalseを返却する
			if (null == retMsgZM0331)
			{
				return false;
			}

			// 集約局を検索
			CAANMsg retMsgZM0341 = findByZM0341Valid(retMsgZM0331.getString(ZM0341ETMsg.SHYAKK_CD));

			// 集約局が取得できない場合はfalseを返却する
			if (null == retMsgZM0341)
			{
				return false;
			}
		}

		// それ以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * オプションサービス契約のIPv6登録チェック（集約局コード）を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 親サービス契約がMTグローバルかつ集約局コードが未定のデータが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isIPv6AddChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// サービス契約番号を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);
		
		// サービス契約番号が設定されていない場合
		if (null == svcKeiNo)
		{
			return true;
		}
		
		// MTグローバルのデータ件数を取得
		long lDataCnt = new JKKejbKRCKCommon().getMTGrobal(inMsg, inContext, svcKeiNo);

		// 対象のデータが0件の場合はtrueを返却する
		if (lDataCnt == 0)
		{
			return true;
		}

		// サービス契約番号に紐づくサービス契約回線内訳のデータを取得
		CAANMsg[] retMsgKK0251List = findByKK0251WithSvc(inMsg, inContext, svcKeiNo);

		// 対象のサービス契約回線内訳が存在しない場合はfalseを返却する
		if (1 > retMsgKK0251List.length)
		{
			return false;
		}

		for (CAANMsg retMsgKK0251: retMsgKK0251List)
		{
			// 集約局コードが未設定のレコードが存在する場合はfalseを返却する
			if (retMsgKK0251.isNull(KK0251ETMsg.SHYAKK_CD))
			{
				return false;
			}
		}

		// それ以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * オプションサービス契約のIPv6登録チェック（集約局中心局コード）を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 親サービス契約がHT、MT光配線かつ集約局コードに紐付く中心局が取得できない場合はfalse。それ以外の場合はtrue。
	 */
	public boolean isIPv6AddShuyakCentChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// サービス契約番号を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);

		// サービス契約番号が設定されていない場合はtrueを返却する
		if (null == svcKeiNo)
		{
			return true;
		}

		// MTグローバルのデータ件数を取得
		long lDataCnt = new JKKejbKRCKCommon().getMTGrobal(inMsg, inContext, svcKeiNo);

		// 対象のデータが0件の場合はtrueを返却する
		if (lDataCnt == 0)
		{
			return true;
		}

		// サービス契約番号に紐づくサービス契約回線内訳のデータを取得
		CAANMsg[] retMsgKK0251List = findByKK0251WithSvc(inMsg, inContext, svcKeiNo);

		// 対象のサービス契約回線内訳が存在しない場合はfalseを返却する
		if (1 > retMsgKK0251List.length)
		{
			return false;
		}

		for (CAANMsg retMsgKK0251: retMsgKK0251List)
		{
			// 集約局を検索
			CAANMsg retMsgZM0341 = findByZM0341Valid(retMsgKK0251.getString(KK0251ETMsg.SHYAKK_CD));

			// 集約局が取得できない場合はfalseを返却する
			if (null == retMsgZM0341)
			{
				return false;
			}
		}

		// それ以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * オプションサービス予約可能期間チェック処理を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param tagYmd 対象日付
	 * @return 対象日付 ＞ 運用年月日 + オプションサービス.予約可能期間の場合はfalse。それ以外の場合はtrue。
	 */
	public boolean isOpSvcRsvValidChk(CAANMsg inMsg, AgentDispatchContext inContext, String tagYmd)
	{
		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// オプションサービスのカレント検索を行う
		CAANMsg inMsgKK0821 = new CAANMsg(KK0821ETMsg.class.getName());
		inMsgKK0821.set(KK0821ETMsg.OP_SVC_CD, inMsg.getString(KK0351ETMsg.OP_SVC_CD));
		inMsgKK0821.set(KK0821ETMsg.RSV_APLY_YMD, opeDate);

		// オプションサービスのカレントレコードを取得
		CAANMsg retMsgKK0821 = new JKKejbKK0821DBABase().findByCurrent(inMsgKK0821);

		// カレントレコードが存在しない場合はfalseを返却する
		if (null == retMsgKK0821)
		{
			throw new JKKejbBusinessException("オプションサービスが取得できませんでした。");
		}

		// 予約可能期間が未設定の場合、trueを返却する
		if (retMsgKK0821.isNull(KK0821ETMsg.RSV_PSB_PRD))
		{
			return true;
		}

		// 予約可能期間を運用日付に加算する
		String rsvPsbPrdAdd = JKKModelCommon.addDay(inMsg, inContext, opeDate, retMsgKK0821.getString(KK0821ETMsg.RSV_PSB_PRD));

		// 対象日付 ＞ 運用年月日 + 予約可能期間の場合falseを返却する
		if (JPCUtilCommon.isFutureDate(tagYmd, rsvPsbPrdAdd, NO_INC_DATE))
		{
			return false;
		}

		// それ以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * 起点変電所・集約局未設定チェック処理を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return サービス契約番号に紐付くサービス契約回線内訳の起点変電所コード・集約局コードが未設定の場合false。それ以外の場合はtrue。
	 */
	public boolean isKitenSyuyakuMatch(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// サービス契約番号を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);

		// サービス契約番号が設定されていない場合はtrueを返却する
		if (null == svcKeiNo)
		{
			return true;
		}

		// サービス契約番号に紐づくサービス契約回線内訳のデータを取得
		CAANMsg[] retMsgKK0251List = findByKK0251WithSvc(inMsg, inContext, svcKeiNo);

		// 対象のサービス契約回線内訳が存在しない場合はfalseを返却する
		if (1 > retMsgKK0251List.length)
		{
			return false;
		}

		for (CAANMsg retMsgKK0251: retMsgKK0251List)
		{
			// 起点変電所コードが設定の設定されている場合は次の明細へ
			if (!retMsgKK0251.isNull(KK0251ETMsg.KITEN_HDSHO_CD))
			{
				continue;
			}

			// 集約局コードが設定されている場合は次の明細へ
			if (!retMsgKK0251.isNull(KK0251ETMsg.SHYAKK_CD))
			{
				continue;
			}

			// 両方未設定だった場合はfalseを返却する
			return false;
		}

		// それ以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * サービス終了年月日未来日制御チェック処理を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return サービス終了年月日が未来日、かつ紐付くサービス契約が"締結済"の場合false。それ以外の場合はtrue。
	 */
	public boolean isSvcEndDtmFutureCtrlWng(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// サービス終了年月日が未設定の場合はtrueを返却
		if (inMsg.isNull(KK0351ETMsg.SVC_ENDYMD))
		{
			return true;
		}

		// サービス終了年月日が過去日（当日を含む）の場合はtrueを返却
		if (JPCUtilCommon.isPastDate(inMsg.getString(KK0351ETMsg.SVC_ENDYMD), JKKModelCommon.getOpeDate(inMsg), "1"))
		{
			return true;
		}

		// オプションサービスに紐付くサービス契約カレントレコードを取得する
		CAANMsg retMsgKK0081 = new JKKejbKRCKCommon().getOyaKK0081(inMsg, inMsg);

		// カレントレコードが存在しない場合はfalseを返却する
		if (null == retMsgKK0081)
		{
			return false;
		}

		// サービス契約のステータスが"締結済"の場合はfalseを返却する
		if (JKKModelConst.SVC_KEI_STAT_CNC_ZM.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT)))
		{
			return false;
		}
		
		// それ以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * 対象日付未来日設定チェック処理処理を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param tagYmd 対象日付
	 * @return 対象日付が未来日、かつ紐付くサービス契約が"休止・中断中"の場合false。それ以外の場合はtrue。
	 */
	public boolean isSvcTagYmdFutureChk(CAANMsg inMsg, AgentDispatchContext inContext, String tagYmd)
	{
		// 対象日付が未設定の場合はtrueを返却
		if (null == tagYmd)
		{
			return true;
		}

		// 対象日付が過去日（当日を含む）の場合はtrueを返却
		if (JPCUtilCommon.isPastDate(tagYmd, JKKModelCommon.getOpeDate(inMsg), "1"))
		{
			return true;
		}

		// オプションサービスに紐付くサービス契約カレントレコードを取得する
		CAANMsg retMsgKK0081 = new JKKejbKRCKCommon().getOyaKK0081(inMsg, inMsg);

		// カレントレコードが存在しない場合はfalseを返却する
		if (null == retMsgKK0081)
		{
			return false;
		}

		// サービス契約のステータスが"休止・中断中"の場合はfalseを返却する
		if (JKKModelConst.SVC_KEI_STAT_PAUSE_STP_CHU.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT)))
		{
			return false;
		}
		
		// それ以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * 中心局一致チェック処理を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return サービス契約回線内訳の中心局コードと、IPv6アドレスの中心局コードが一致しない場合false。それ以外の場合はtrue。
	 */
	public boolean isCentCdMatch(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// サービス契約番号を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);

		// サービス契約番号が設定されていない場合はtrueを返却する
		if (null == svcKeiNo)
		{
			return true;
		}

		// サービス契約番号に紐づくサービス契約回線内訳のデータを取得
		CAANMsg[] retMsgKK0251List = findByKK0251WithSvc(inMsg, inContext, svcKeiNo);

		// 対象のサービス契約回線内訳が存在しない場合はfalseを返却する
		if (1 > retMsgKK0251List.length)
		{
			return false;
		}

		// 中心局コードを取得する
		ArrayList<String> arrayCent = getCentCdByList(retMsgKK0251List);

		// 中心局コードが取得できなかった場合はfalseを返却する
		if (1 > arrayCent.size())
		{
			return false;
		}

		// オプションサービス契約<ISP>のカレントレコードを取得する
		CAANMsg retMsgKK0361 = findCurrentKK0361(inMsg);

		// カレントレコードが存在しない場合はfalseを返却する
		if (null == retMsgKK0361)
		{
			return false;
		}

		// オプションサービス契約<ISP>に紐付くIPv6アドレスを取得する
		CAANMsg retMsgZM0481 = findByZM0481Valid(retMsgKK0361.getString(KK0361ETMsg.IPV6_AD_IFID));

		// レコードが存在しない場合はfalseを返却する
		if (null == retMsgZM0481)
		{
			return false;
		}

		// 中心局コードを取得
		String centCdByIpv6 = retMsgZM0481.getString(ZM0481ETMsg.CHUSKK_CD);

		// サービス契約回線内訳の中心局コードと、IPv6アドレスの中心局コードが一致しない場合falseを返却する
		if (!arrayCent.contains(centCdByIpv6))
		{
			return false;
		}

		// それ以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * オプションサービスコードの比較を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param opSvcCd オプションサービスコード
	 * @return 同じ値の場合true,違う値の場合false
	 */
	public boolean isOpSvcCdChk(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object opSvcCd)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);
		
		// 取得できない場合、処理を終了する
		if (null == ret0351)
		{
			return true;
		}
		
		// オプションサービスコードが異なる場合
		if (!opSvcCd.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return false;
		}

		return true;
	}
	
	/**
	 * <p>
	 * オプションサービスコードの比較を行う。(対象2つ)
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param opSvcCd1 オプションサービスコード1
	 * @param opSvcCd2 オプションサービスコード2
	 * @return 同じ値の場合true,違う値の場合false
	 */
	public boolean isOpSvcCdChkTaisho2(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo, Object opSvcCd1, Object opSvcCd2)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);
		
		// 取得できない場合、処理を終了する
		if (null == ret0351)
		{
			return true;
		}
		
		// オプションサービスコードが異なる場合
		if (!opSvcCd1.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD))
			&& !opSvcCd2.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * サービス契約回線内訳のリストから、中心局コードを取得する。
	 * </p>
	 * @param retMsgKK0251List サービス契約回線内訳のリスト
	 * @return 中心局コードのリスト
	 */
	private ArrayList<String> getCentCdByList(CAANMsg[] retMsgKK0251List)
	{
		// 中心局用保持用リスト
		ArrayList<String> arrayCent = new ArrayList<String>();

		for (CAANMsg retMsgKK0251: retMsgKK0251List)
		{
			// 起点変電所コードが設定されている場合
			if (!retMsgKK0251.isNull(KK0251ETMsg.KITEN_HDSHO_CD))
			{
				// 起点変電所を検索
				CAANMsg retMsgZM0331 = findByZM0331Valid(retMsgKK0251.getString(KK0251ETMsg.KITEN_HDSHO_CD));

				// 起点変電所が取得できない場合は次の明細へ
				if (null == retMsgZM0331)
				{
					continue;
				}

				// 集約局を検索
				CAANMsg retMsgZM0341 = findByZM0341Valid(retMsgZM0331.getString(ZM0341ETMsg.SHYAKK_CD));

				// 集約局が取得できない場合は次の明細へ
				if (null == retMsgZM0341)
				{
					continue;
				}

				// 中心局コードを保持して次の明細へ
				arrayCent.add(retMsgZM0341.getString(ZM0341ETMsg.CHUSKK_CD));
			}

			// 集約局コードが設定されている場合
			if (!retMsgKK0251.isNull(KK0251ETMsg.SHYAKK_CD))
			{
				// 集約局を検索
				CAANMsg retMsgZM0341 = findByZM0341Valid(retMsgKK0251.getString(KK0251ETMsg.SHYAKK_CD));

				// 集約局が取得できない場合は次の明細へ
				if (null == retMsgZM0341)
				{
					continue;
				}

				// 中心局コードを保持して次の明細へ
				arrayCent.add(retMsgZM0341.getString(ZM0341ETMsg.CHUSKK_CD));
			}
		}

		return arrayCent;
	}

	/**
	 * <p>
	 * URL（ドメイン）、URL（アカウント）が設定されているかチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return URL（ドメイン）、URL（アカウント）が共に設定されている場合はtrue。設定されていない場合はfalse。
	 */
	public boolean isConfiguredUrl(CAANMsg inMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
				
		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのオプションサービスコードが"B002"（MYホームページ）以外の場合はtrueを返却する
		if (!OP_SVC_CD_MHP.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
		inETMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0361.set(KK0361ETMsg.GENE_ADD_DTM, ret0351.getString(KK0351ETMsg.GENE_ADD_DTM));

		// オプションサービス契約<ISP>のカレント検索を行う
		CAANMsg ret0361 = new JKKejbKK0361DBABase().findByPrimaryKey(inETMsgKK0361);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0361 == null)
		{
			return true;
		}

		// 「URL(ドメイン)」もしくは「URL（アカウント）」が未入力の場合はfalseを返却
		if (ret0361.isNull(KK0361ETMsg.URL_DOMAIN) || ret0361.isNull(KK0361ETMsg.URL_ACCOUNT))
		{
			return false;
		}
		
		return true;
		
	}

	/**
	 * <p>
	 * IPv6アドレス(インターフェイスID)が設定されているかチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return IPv6アドレス(インターフェイスID)が設定されている場合はtrue。設定されていない場合はfalse。
	 */
	public boolean isIpv6Haraidashi(CAANMsg inMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
				
		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのオプションサービスコードが"B070"（ＩＰｖ６アドレス）以外の場合はtrueを返却する
		if (!OP_SVC_IPV6_AD.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
		inETMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0361.set(KK0361ETMsg.GENE_ADD_DTM, ret0351.getString(KK0351ETMsg.GENE_ADD_DTM));

		// オプションサービス契約<ISP>のカレント検索を行う
		CAANMsg ret0361 = new JKKejbKK0361DBABase().findByPrimaryKey(inETMsgKK0361);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0361 == null)
		{
			return true;
		}

		// 「IPv6アドレス(インターフェイスID)」が未入力の場合はfalseを返却
		if (ret0361.isNull(KK0361ETMsg.IPV6_AD_IFID))
		{
			return false;
		}
		
		return true;
		
	}
	
	/**
	 * <p>
	 * IPv6ルーター機器出荷済チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return IPv6ルーター機器が出荷済みの場合true。未出荷の場合はfalse。
	 */
	public boolean isIPv6RouteKikiSyukaChk(CAANMsg inMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
				
		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのオプションサービスコードが"B070"（ＩＰｖ６アドレス）以外の場合はtrueを返却する
		if (!OP_SVC_IPV6_AD.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}
		
		String svcKeiNo = getOyaSvcKeiNo(ret0351);
		
		// サービス契約番号が設定されていない場合はtrueを返却
		if (null == svcKeiNo)
		{
			return true;
		}
		
		// 機器提供サービス契約関連チェック部品
		JKKejbKK0341KRCK kk0341KRCK = new JKKejbKK0341KRCK();
		
		return kk0341KRCK.isIPv6RouteKikiSyukaChk(inMsg, inContext, svcKeiNo);
		
	}
	
	/**
	 * <p>
	 * サービス契約内訳のカレント検索を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return 検索結果
	 */
	private CAANMsg getKK0161Crrent(CAANMsg inMsg, String svcKeiUcwkNo)
	{
		// カレントレコードの取得を行う。
		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0161ETMsg.class.getName());
		msg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		msg.set(KK0161ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		return new JKKejbKK0161DBABase().findByCurrent(msg);
	}
	
	/**
	 * <p>
	 * 親識別を元にサービス契約番号を取得する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return サービス契約番号
	 */
	private String getOyaSvcKeiNo(CAANMsg inMsg)
	{
		// 親契約識別コードがサービス契約の場合
		if (OYA_KEI_SKBT_CD_SVC_KEI.equals(inMsg.getString(KK0351ETMsg.OYA_KEI_SKBT_CD)))
		{
			// サービス契約番号が設定されていない場合
			if (inMsg.isNull(KK0351ETMsg.SVC_KEI_NO))
			{
				return null;
			}
			
			return inMsg.getString(KK0351ETMsg.SVC_KEI_NO);
		}
		// 親契約識別コードがサービス契約内訳の場合
		else if (OYA_KEI_SKBT_CD_SVC_KEI_UCWK.equals(inMsg.getString(KK0351ETMsg.OYA_KEI_SKBT_CD)))
		{
			// サービス契約内訳番号が設定されていない場合
			if (inMsg.isNull(KK0351ETMsg.SVC_KEI_UCWK_NO))
			{
				return null;
			}
			
			CAANMsg ret0161 = getKK0161Crrent(inMsg, inMsg.getString(KK0351ETMsg.SVC_KEI_UCWK_NO));
			
			// サービス契約内訳のカレントレコード取得に失敗した場合
			if (null == ret0161)
			{
				return null;
			}
			
			return ret0161.getString(KK0351ETMsg.SVC_KEI_NO);
			
		}
		// 上記以外の場合
		else
		{
			return null;
		}
	}

	/**
	 * <p>
	 * オプションサービス契約のデータを取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo 対象のサービス契約番号
	 * @param opSvcCd 対象のオプションサービスコード
	 * @return オプションサービス契約のデータ件数
	 */
	private long getCountKK0351(CAANMsg inMsg, AgentDispatchContext inContext, Object svcKeiNo, Object opSvcCd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		long lDataCnt = 0L;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT ")
					.append("    COUNT(*) AS CNT ")
					.append("FROM ")
					.append("    KK_T_OP_SVC_KEI KK0351 ")
					.append("WHERE ")
					.append("    KK0351.SVC_KEI_NO = ? ")
					.append("    AND KK0351.OP_SVC_KEI_STAT = '100' ")
					.append("    AND KK0351.OP_SVC_CD =? ")
					.append("    AND (KK0351.OP_SVC_KEI_NO, KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM) = ")
					.append("        (SELECT KK0351_GENE.OP_SVC_KEI_NO, MAX(KK0351_GENE.RSV_APLY_YMD || KK0351_GENE.GENE_ADD_DTM) AS KK0351_MAX ")
					.append("         FROM   KK_T_OP_SVC_KEI KK0351_GENE ")
					.append("         WHERE  KK0351_GENE.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ")
					.append("         AND    KK0351_GENE.RSV_APLY_YMD <= ? ")
					.append("         AND    KK0351_GENE.RSV_APLY_CD = '2' ")
					.append("         AND    KK0351_GENE.MK_FLG= '0' ")
					.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, svcKeiNo.toString());
			// パラメータの設定(オプションサービスコードを指定)
			CAANJDBCUtil.setParam(pstmt, 2, opSvcCd.toString());
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 件数を返却する
			if (rsltQuery.next())
			{
				lDataCnt = rsltQuery.getLong("CNT");
			}

		}
		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 lDataCnt;
	}

	/**
	 * <p>
	 * サービス契約内訳のデータを取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo 対象のサービス契約番号
	 * @return サービス契約内訳のデータ件数
	 */
	private long getCountKK0161(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		long lDataCnt = 0L;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT ")
					.append("    COUNT(*) AS CNT ")
					.append("FROM ")
					.append("    KK_T_SVC_KEI_UCWK KK0161 ")
					.append("WHERE ")
					.append("    KK0161.SVC_KEI_NO = ? ")
					.append("    AND KK0161.SVC_KEI_UCWK_STAT = '100' ")
					.append("    AND (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) = ")
					.append("        (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX ")
					.append("         FROM   KK_T_SVC_KEI_UCWK KK0161_GENE ")
					.append("         WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ")
					.append("         AND    KK0161_GENE.RSV_APLY_YMD <= ? ")
					.append("         AND    KK0161_GENE.RSV_APLY_CD = '2' ")
					.append("         AND    KK0161_GENE.MK_FLG= '0' ")
					.append("         GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 件数を返却する
			if (rsltQuery.next())
			{
				lDataCnt = rsltQuery.getLong("CNT");
			}

		}
		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 lDataCnt;
	}

	/**
	 * <p>
	 * サービス契約内訳のデータを取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param pcrsCdBf 変更前料金コースコード
	 * @param pcrsCdAf 変更後料金コースコード
	 * @return 指定された料金コースコードに紐付く料金コース変更可能機能識別コード
	 */
	private String getKinoCdKK1631(CAANMsg inMsg, AgentDispatchContext inContext, String pcrsCdBf, String pcrsCdAf)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		String retCd = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK1631ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT ")
					.append("    KK1631.PCRS_CGPSB_KINO_SKBT_CD ")
					.append("FROM ")
					.append("    KK_M_PCRS_CHG_PSBJKN KK1631 ")
					.append("WHERE ")
					.append("    KK1631.CHG_BF_PCRS_CD = ? ")
					.append("    AND KK1631.CHG_AF_PCRS_CD = ? ")
					.append("    AND KK1631.PCRS_CHG_PSBJKN_TSTAYMD <= ? ")
					.append("    AND KK1631.PCRS_CHG_PSBJKN_TENDYMD >= ? ")
					.append("    AND (KK1631.CHG_BF_PCRS_CD, KK1631.CHG_AF_PCRS_CD, KK1631.RSV_APLY_YMD || KK1631.GENE_ADD_DTM) = ")
					.append("        (SELECT KK1631_GENE.CHG_BF_PCRS_CD, KK1631_GENE.CHG_AF_PCRS_CD, MAX(KK1631_GENE.RSV_APLY_YMD || KK1631_GENE.GENE_ADD_DTM) AS KK1631_MAX ")
					.append("         FROM   KK_M_PCRS_CHG_PSBJKN KK1631_GENE ")
					.append("         WHERE  KK1631_GENE.CHG_BF_PCRS_CD = KK1631.CHG_BF_PCRS_CD ")
					.append("         AND    KK1631_GENE.CHG_AF_PCRS_CD = KK1631.CHG_AF_PCRS_CD ")
					.append("         AND    KK1631_GENE.RSV_APLY_YMD <= ? ")
					.append("         AND    KK1631_GENE.MK_FLG= '0' ")
					.append("         GROUP BY KK1631_GENE.CHG_BF_PCRS_CD, KK1631_GENE.CHG_AF_PCRS_CD) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(変更前料金コースコード)
			CAANJDBCUtil.setParam(pstmt, 1, pcrsCdBf);
			// パラメータの設定(変更後料金コースコード)
			CAANJDBCUtil.setParam(pstmt, 2, pcrsCdAf);
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 4, JKKModelCommon.getOpeDate(inMsg));
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 5, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 件数を返却する
			if (rsltQuery.next())
			{
				retCd = rsltQuery.getString(1);
			}

		}
		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 retCd;
	}

	/**
	 * <p>
	 * 希望メールアカウントが変更される場合のNGワードチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param strMlAcctNm 対象希望メールアカウントの項目名
	 * @return 対象の希望メールアカウントがNGワードに存在する場合はtrue。存在しない場合はfalse。
	 */
	private boolean isNotNgCngAccount(CAANMsg inMsg, AgentDispatchContext inContext, String strMlAcctNm)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのオプションサービスコードが"B001"（Eメール）以外の場合はtrueを返却する
		if (!OP_SVC_CD_EML.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0361 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0361.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));

		// オプションサービス契約<ISP>のカレント検索を行う
		CAANMsg ret0361 = new JKKejbKK0361DBABase().findByCurrent(inETMsgKK0361);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0361 == null)
		{
			return true;
		}

		// 変更前と変更後の希望メールアカウントが一致する場合はtrueを返却する
		if (compareValue(inMsg.getString(strMlAcctNm), ret0361.getString(strMlAcctNm)))
		{
			return true;
		}

		// NGワードチェック処理を呼び出す
		JKKejbKRCKCommon krckc = new JKKejbKRCKCommon();
		return krckc.isNotExistsNg(inMsg, inContext, NG_WORD_CD_MLAD, inMsg.getString(strMlAcctNm));
	}

	/**
	 * <p>
	 * ２項目の設定値の差分チェックを行う。
	 * </p>
	 * @param str1 項目１
	 * @param str2 項目２
	 * @return ２項目の設定値が同じ場合はtrue。異なる場合はfalse。
	 */
	public boolean compareValue(String str1, String str2)
	{
		if (str1 == null)
		{
			if (str2 == null)
			{
				return true;
			}
		}
		else if (str1.equals(str2))
		{
			return true;
		}

		return false;
	}

	/**
	 * <p>
	 * サービス契約番号に紐づく、サービス契約回線内訳を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo 対象のサービス契約番号
	 * @return 未定集約局コードのデータ件数
	 */
	private CAANMsg[] findByKK0251WithSvc(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0251ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT ");
			sql_Buff.append("    KK0251.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append("    , KK0251.KITEN_HDSHO_CD ");
			sql_Buff.append("    , KK0251.SHYAKK_CD ");
			sql_Buff.append("FROM ");
			sql_Buff.append("    KK_T_KAISEN_TG_SVKEI KK0241 ");
			sql_Buff.append("INNER JOIN  KK_T_SVKEI_KAISEN_UW KK0251 ");
			sql_Buff.append("        ON  KK0251.SVC_KEI_KAISEN_UCWK_NO = KK0241.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append("WHERE ");
			sql_Buff.append("    KK0241.SVC_KEI_NO = ? ");;
			sql_Buff.append("    AND   KK0241.KAISEN_UCWK_USE_STAYMD <= ? ");
			sql_Buff.append("    AND  (KK0241.SVC_KEI_NO, KK0241.KAISEN_UCWK_USE_ENDYMD) = ");
			sql_Buff.append("         (SELECT KK0241_MAX.SVC_KEI_NO, MAX(KK0241_MAX.KAISEN_UCWK_USE_ENDYMD) AS KAISEN_UCWK_USE_ENDYMD ");
			sql_Buff.append("            FROM KK_T_KAISEN_TG_SVKEI KK0241_MAX ");
			sql_Buff.append("           WHERE KK0241_MAX.SVC_KEI_NO = KK0241.SVC_KEI_NO ");
			sql_Buff.append("             AND KK0241_MAX.KAISEN_UCWK_USE_STAYMD <= ? ");
			sql_Buff.append("             AND KK0241_MAX.MK_FLG = '0' ");
			sql_Buff.append("           GROUP BY KK0241_MAX.SVC_KEI_NO) ");
			sql_Buff.append("    AND  KK0241.MK_FLG = '0' ");
			sql_Buff.append("    AND  (KK0251.SVC_KEI_KAISEN_UCWK_NO, KK0251.GENE_ADD_DTM) = ");
			sql_Buff.append("         (SELECT KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO, MAX(KK0251_GENE.GENE_ADD_DTM) ");
			sql_Buff.append("            FROM KK_T_SVKEI_KAISEN_UW KK0251_GENE ");
			sql_Buff.append("           WHERE KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO = KK0251.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append("             AND KK0251_GENE.MK_FLG = '0' ");
			sql_Buff.append("             GROUP BY KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 返却用リスト
			ArrayList<CAANMsg> retArray = new ArrayList<CAANMsg>();

			// 取得結果の設定
			while (rsltQuery.next())
			{
				CAANMsg retMsg = new CAANMsg(KK0251ETMsg.class.getName());
				retMsg.set(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO, rsltQuery.getString(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO));
				retMsg.set(KK0251ETMsg.KITEN_HDSHO_CD, rsltQuery.getString(KK0251ETMsg.KITEN_HDSHO_CD));
				retMsg.set(KK0251ETMsg.SHYAKK_CD, rsltQuery.getString(KK0251ETMsg.SHYAKK_CD));
				
				retArray.add(retMsg);
			}

			return retArray.toArray(new CAANMsg[0]);
		}
		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);
			}
		}
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のカレントレコードの検索を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージ
	 * @return オプションサービス契約<ISP>のカレントレコード
	 */
	private CAANMsg findCurrentKK0361(CAANMsg inMsg)
	{
		// オプションサービス契約のカレントレコード検索
		CAANMsg msgMain = new CAANMsg(KK0351ETMsg.class.getName());
		msgMain.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));
		msgMain.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		CAANMsg retMsgMain = new JKKejbKK0351DBABase().findByCurrent(msgMain);

		// 取得できない場合はnullを返却する
		if (null == retMsgMain)
		{
			return null;
		}

		// オプションサービス契約<ISP>の一意検索
		CAANMsg msgSub = new CAANMsg(KK0361ETMsg.class.getName());
		msgSub.set(KK0361ETMsg.OP_SVC_KEI_NO, retMsgMain.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		msgSub.set(KK0361ETMsg.GENE_ADD_DTM, retMsgMain.getString(KK0351ETMsg.GENE_ADD_DTM));

		return new JKKejbKK0361DBABase().findByPrimaryKey(msgSub);
	}

	/**
	 * <p>
	 * 起点変電所コードに紐づく、有効な起点変電所レコードを取得する。
	 * </p>
	 * @param kitenHdshoCd 起点変電所コード
	 * @return 起点変電所コードに紐づく有効な起点変電所のレコード
	 */
	private CAANMsg findByZM0331Valid(String kitenHdshoCd)
	{
		// 一意検索用メッセージ
		CAANMsg inMsgZM0331 = new CAANMsg(ZM0331ETMsg.class.getName());
		inMsgZM0331.set(ZM0331ETMsg.KITEN_HDSHO_CD, kitenHdshoCd);

		// 一意検索
		CAANMsg retMsgZM0331 = new ZM0331LE().findByPrimaryKey(inMsgZM0331);

		// データが取得できなかった場合はnullを返却
		if (null == retMsgZM0331)
		{
			return null;
		}

		// 取得結果が有効でない場合はnullを返却
		if (!MK_FLG_YUKO.equals(retMsgZM0331.getString(ZM0331ETMsg.MK_FLG)))
		{
			return null;
		}

		return retMsgZM0331;
	}

	/**
	 * <p>
	 * 集約局コードに紐づく、有効な集約局レコードを取得する。
	 * </p>
	 * @param shyakkCd 集約局コード
	 * @return 集約局コードに紐づく有効な集約局のレコード
	 */
	private CAANMsg findByZM0341Valid(String shyakkCd)
	{
		// 一意検索用メッセージ
		CAANMsg inMsgZM0341 = new CAANMsg(ZM0341ETMsg.class.getName());
		inMsgZM0341.set(ZM0341ETMsg.SHYAKK_CD, shyakkCd);

		// 一意検索
		CAANMsg retMsgZM0341 = new ZM0341LE().findByPrimaryKey(inMsgZM0341);

		// データが取得できなかった場合はnullを返却
		if (null == retMsgZM0341)
		{
			return null;
		}

		// 取得結果が有効でない場合はnullを返却
		if (!MK_FLG_YUKO.equals(retMsgZM0341.getString(ZM0341ETMsg.MK_FLG)))
		{
			return null;
		}

		return retMsgZM0341;
	}

	/**
	 * <p>
	 * IPv6アドレス(インターフェイスID)に紐づく、有効なIPv6アドレスを取得する。
	 * </p>
	 * @param ipv6AdIfid IPv6アドレス(インターフェイスID)
	 * @return IPv6アドレス(インターフェイスID)に紐づく有効なIPv6アドレスのレコード
	 */
	private CAANMsg findByZM0481Valid(String ipv6AdIfid)
	{
		// 一意検索用メッセージ
		CAANMsg inMsgZM0481 = new CAANMsg(ZM0481ETMsg.class.getName());
		inMsgZM0481.set(ZM0481ETMsg.IPV6_AD_IFID, ipv6AdIfid);

		// 一意検索
		CAANMsg retMsgZM0481 = new ZM0481LE().findByPrimaryKey(inMsgZM0481);

		// データが取得できなかった場合はnullを返却
		if (null == retMsgZM0481)
		{
			return null;
		}

		// 取得結果が有効でない場合はnullを返却
		if (!MK_FLG_YUKO.equals(retMsgZM0481.getString(ZM0481ETMsg.MK_FLG)))
		{
			return null;
		}

		return retMsgZM0481;
	}
	
	/**
	 * <p>
	 * サービス解約理由コードのチェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return サービス解約理由コードが引継解約の場合はfalse。左記以外の場合はtrue。
	 */
	public boolean isCheckDlreCdCurrent(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 「オプションサービス契約」が未入力の場合はチェックを行わない
		if (inMsg.isNull(KK0351ETMsg.OP_SVC_KEI_NO))
		{
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのサービス解約理由コードが"04"（引継解約）の場合はfalseを返却する
		if (!SVC_DLRE_CD_KAI_OVER.equals(ret0351.getString(KK0351ETMsg.SVC_DLRE_CD)))
		{
			return true;
		}

		return false;
	}

	/**
	 * <p>
	 * 割賦情報有効チェックを行います(タブレット)
	 * </p>
	 * @param kk0351Msg 処理対象の「オプションサービス契約」メッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true：チェックOK  false：チェックNG
	 */
	public boolean isKapInfoExsistTab(CAANMsg kk0351Msg, AgentDispatchContext inContext)
	{
		// 対象の「オプションサービス契約」の親「サービス契約」を取得する。
		String opeDate = JKKModelCommon.getOpeDate(kk0351Msg);
		CAANMsg kk0081Msg = new JKKejbKK0081DBABase().getKK0081byOpSvcKei(kk0351Msg, opeDate);

		// 追加検索条件：機器提供サービス契約.機器提供サービスコード = "タブレット"
		HashMap<String, String[]> searchJknMap = new HashMap<String, String[]>();
		searchJknMap.put(KK0341ETMsg.KKTK_SVC_CD, new String[]{JKKModelConst.KKTK_SVC_CD_TABLET});

		// 該当の「サービス契約」配下の「機器提供サービス契約」(タブレット)を取得する。
		String svcKeiNo = kk0081Msg.getString(KK0081ETMsg.SVC_KEI_NO);
		CAANMsg[] kk0341MsgList = new JKKejbKK0341DBABase().getKK0341bySvcKei(svcKeiNo, searchJknMap, opeDate, "4");

		for (CAANMsg kk0341Msg : kk0341MsgList)
		{
			// 割賦情報が有効な件数を取得する
			long kapKeiCnt = this.getKapInfoExsistCnt(kk0351Msg, inContext, kk0341Msg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO));

			// 割賦情報が１件でも存在した場合
			if (kapKeiCnt > 0)
			{
				return false;
			}
		}
		return true;
	}

	/**
	 * <p>
	 * 割賦情報の有効数を取得します(タブレット)
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kikiTeikyoSvcKeiNo 機器提供サービス契約番号
	 * @return 割賦情報の有効数
	 */
	private long getKapInfoExsistCnt(CAANMsg inMsg, AgentDispatchContext inContext, String kikiTeikyoSvcKeiNo)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		long lDataCnt = 0L;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK2541ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
			        .append("     COUNT(*) AS CNT ")
			        .append(" FROM ")
			        .append("     KK_T_KAP_KEI KK2541 ")
			        .append(" WHERE ")
			        .append("     KK2541.KKTK_SVC_KEI_NO = ? ")
			        .append("     AND KK2541.KAP_KEI_STAT NOT IN ('910', '920') ")
			        .append("     AND KK2541.KAP_SEIKY_STA_YM IS NOT NULL ")
			        .append("     AND KK2541.KAP_SEIKY_ENDYMD IS NOT NULL ")
			        .append("     AND KK2541.KAP_PAY_ZAN_CNT > 0 ")
			        .append("     AND (KK2541.KAP_KEI_NO, KK2541.RSV_APLY_YMD || KK2541.GENE_ADD_DTM) =  ")
			        .append("         (SELECT KK2541_GENE.KAP_KEI_NO, MAX(KK2541_GENE.RSV_APLY_YMD || KK2541_GENE.GENE_ADD_DTM) AS KK2541_MAX  ")
			        .append("          FROM   KK_T_KAP_KEI KK2541_GENE  ")
			        .append("          WHERE  KK2541_GENE.KAP_KEI_NO = KK2541.KAP_KEI_NO  ")
			        .append("          AND    KK2541_GENE.RSV_APLY_YMD <= ?  ")
			        .append("          AND    KK2541_GENE.RSV_APLY_CD = '2'  ")
			        .append("          AND    KK2541_GENE.MK_FLG= '0' ")
			        .append("          GROUP BY KK2541_GENE.KAP_KEI_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(機器提供サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, kikiTeikyoSvcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 件数を返却する
			if (rsltQuery.next())
			{
				lDataCnt = rsltQuery.getLong("CNT");
			}
		}
		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 lDataCnt;
	}

	/**
	 * オプションサービス予約可能期間(親サービス含む)チェック処理
	 * <p>
	 * 指定された日付が、親サービス契約が「テレビサービス」の場合は運用日付の翌月末まで、
	 * 親サービス契約が「テレビサービス」以外の場合は対象のオプションサービスの期間内かのチェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param tagYmd 対象日付
	 * @return 親サービス契約のサービスコードが"テレビサービス"の時、対象日付が運用日付の翌月末日を超過していない場合はtrue。
	 *          親サービス契約のサービスコードが"テレビサービス"でない時、対象日付が運用日＋予約条件日数を超過していない場合はtrue。
	 *          上記以外の場合はfalse。
	 */
	public boolean isOpSvcRsvValidOyaSvcChk(CAANMsg inMsg, AgentDispatchContext inContext, String tagYmd)
	{
		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// オプションサービス契約のカレント検索を行う
		CAANMsg inKK0351ETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inKK0351ETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		inKK0351ETMsg.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);

		// オプションサービス契約のカレントレコードを取得
		CAANMsg outKK0351ETMsg = findByCurrent(inKK0351ETMsg);

		// カレントレコードが存在しない場合はfalseを返却する
		if (null == outKK0351ETMsg)
		{
			throw new JKKejbBusinessException("オプションサービス契約が取得できませんでした。");
		}

		// オプションサービスに紐付くサービス契約カレントレコードを取得する
		CAANMsg curKK0081ETMsg = new JKKejbKRCKCommon().getOyaKK0081(inMsg, outKK0351ETMsg);

		// サービス契約のカレントが取得できない場合、falseを返却する
		if (null == curKK0081ETMsg)
		{
			throw new JKKejbBusinessException("オプションサービス契約に紐付く親サービス契約が取得できませんでした。");
		}

//OM-2016-0000143 MOD START 20160209
		// テレビサービスの場合
//		if (SVC_CD_TV.equals(curKK0081ETMsg.getString(KK0081ETMsg.SVC_CD)))
		if (OP_SVC_CD_CGS.equals(outKK0351ETMsg.getString(KK0351ETMsg.OP_SVC_CD)))
//OM-2016-0000143 MOD END 20160209
		{
			try
			{
				// 運用日付の翌月末日を取得する
				String nextMonthEndYmd = JPCUtilCommon.addMonth(opeDate, 1).substring(0, 6);
				nextMonthEndYmd = nextMonthEndYmd + JPCUtilCommon.getEndOfMonth(nextMonthEndYmd);

				// 対象日付 ＞ 運用日付の翌月末日の場合、falseを返却する
				if (JPCUtilCommon.isFutureDate(tagYmd, nextMonthEndYmd, NO_INC_DATE))
				{
					return false;
				}
			}
			catch (ParseException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
//OM-2016-0000143 MOD START 2016/02/09
		// テレビサービスでない場合
//		if (!SVC_CD_TV.equals(curKK0081ETMsg.getString(KK0081ETMsg.SVC_CD)))
		else
//OM-2016-0000143 MOD END 2016/02/09
		{
			// オプションサービス予約可能期間チェックを行い、返却値をそのまま返却する
			return isOpSvcRsvValidChk(outKK0351ETMsg, inContext, tagYmd);
		}

		return true;
	}
	
	/**
	 * オプションサービス回復可能期間（オプションサービス契約）チェック処理
	 * <p>
	 * 指定された日付が、対象のオプションサービス契約のサービス解約日に
	 * オプションサービスの回復可能期間を加算した期間内であるかのチェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param targetDate 対象日付
	 * @return 対象日付がサービス解約年月日 + 回復可能期間を超過していない場合はtrue。
	 *          上記以外の場合はfalse。
	 */
	public boolean isOpSvcKaihkValidChk(CAANMsg inMsg, AgentDispatchContext inContext, String targetDate)
	{
		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// オプションサービス契約のカレント検索を行う
		CAANMsg inKK0351ETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inKK0351ETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		inKK0351ETMsg.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);

		// オプションサービス契約のカレントレコードを取得
		CAANMsg outKK0351ETMsg = findByCurrent(inKK0351ETMsg);

		// カレントレコードが存在しない又はサービス解約年月日がnullの場合はfalseを返却する
		if (null == outKK0351ETMsg || outKK0351ETMsg.isNull(KK0351ETMsg.SVC_DSL_YMD))
		{
			throw new JKKejbBusinessException("オプションサービス契約が取得できませんでした。");
		}

		// オプションサービスのカレント検索を行う
		CAANMsg inKK0821ETMsg = new CAANMsg(KK0821ETMsg.class.getName());
		inKK0821ETMsg.set(KK0821ETMsg.OP_SVC_CD, outKK0351ETMsg.getString(KK0351ETMsg.OP_SVC_CD));
		inKK0821ETMsg.set(KK0821ETMsg.RSV_APLY_YMD, opeDate);

		// オプションサービスのカレントレコードを取得
		CAANMsg outKK0821ETMsg = new JKKejbKK0821DBABase().findByCurrent(inKK0821ETMsg);

		// カレントレコードが存在しない場合はfalseを返却する
		if (null == outKK0821ETMsg)
		{
			throw new JKKejbBusinessException("オプションサービスが取得できませんでした。");
		}

		// 回復可能期間が未設定の場合、trueを返却する
		if (outKK0821ETMsg.isNull(KK0821ETMsg.KAIHK_PSB_PRD))
		{
			return true;
		}

		// 回復可能期間をサービス解約年月日に加算する
		String kaihkPsbPrdAdd = JKKModelCommon.addDay(inMsg, inContext, outKK0351ETMsg.getString(KK0351ETMsg.SVC_DSL_YMD), 
				outKK0821ETMsg.getString(KK0821ETMsg.KAIHK_PSB_PRD));

		// 対象日付 ＞ サービス解約年月日 + 回復可能期間の場合falseを返却する
		if (JPCUtilCommon.isFutureDate(targetDate, kaihkPsbPrdAdd, NO_INC_DATE))
		{
			return false;
		}

		// それ以外の場合はtrueを返却する
		return true;
	}
	
	/**
	 * マルチセッション解約予約契約チェック処理
	 * <p>
	 * 指定された「オプションサービス契約」のステータスが"固定グローバルIPアドレス"である場合、
	 * 同一「サービス契約」に紐づく「オプションサービス契約」の「オプションサービスコード」が"マルチセッション"且、
	 * 解約予約レコードでない契約が存在するのチェックを行う
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 固定グローバルIPアドレスの「オプションサービス契約」に紐付く"マルチセッション"の解約予約レコードがない契約が存在する場合、true。
	 *          上記以外の場合はfalse。
	 */
	public boolean isMltSsinDslRcvKeiChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// オプションサービス契約のカレント検索を行う
		CAANMsg inKK0351ETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inKK0351ETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		inKK0351ETMsg.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);

		// オプションサービス契約のカレントレコードを取得
		CAANMsg outKK0351ETMsg = findByCurrent(inKK0351ETMsg);

		// カレントレコードが存在しない場合は例外を発行
		if (null == outKK0351ETMsg)
		{
			throw new JKKejbBusinessException("オプションサービス契約が取得できませんでした。");
		}

		// (2)の検索結果．オプションサービスコード ≠ "B004" または (2)の検索結果．親契約識別コード ≠ "03" の場合、falseを返却
		if (!OP_SVC_CD_KIA.equals(outKK0351ETMsg.getString(KK0351ETMsg.OP_SVC_CD))
				|| !OYA_KEI_SKBT_CD_SVC_KEI_UCWK.equals(outKK0351ETMsg.getString(KK0351ETMsg.OYA_KEI_SKBT_CD)))
		{
			return false;
		}

		// マルチセッションオプションサービス(サービス契約内訳)取得処理よりオプションサービス契約番号の一覧を取得する
		ArrayList<String> getOpSvcKeiNoList = 
			getMltSessionOpSvKeiNoList(inMsg, inContext, outKK0351ETMsg.getString(KK0351ETMsg.SVC_KEI_UCWK_NO));

		// マルチセッションオプションサービス(サービス契約内訳)取得処理の返却件数が0件の場合、falseを返却
		if (null == getOpSvcKeiNoList || getOpSvcKeiNoList.size() == 0)
		{
			return false;
		}

		// 解約予約が存在するかの判定を行う
		// マルチセッションオプションサービス(サービス契約内訳)取得処理結果の件数分繰り返す
		for (int i = 0; i < getOpSvcKeiNoList.size(); i++)
		{
			// 解約予約(オプションサービス契約)件数取得処理の検索結果．件数が0件の場合、trueを返却する
			if (getDlsRcvOpSvcKeiCnt(inMsg, inContext, getOpSvcKeiNoList.get(i)) == 0L)
			{
				return true;
			}
		}

		// 上記以外、falseを返却
		return false;
	}

	/**
	 * <p>
	 * マルチセッションオプションサービス(サービス契約内訳)取得処理
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiUcwkNo サービス契約番号
	 * @return 固定グローバルIPアドレスの「オプションサービス契約」に紐付く、"マルチセッション"のオプションサービス契約番号の一覧
	 */
	private ArrayList<String> getMltSessionOpSvKeiNoList(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiUcwkNo)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		// 返却用件数
		ArrayList<String> retList = null;
		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());
			// SQL文
			StringBuffer sbSql = new StringBuffer();

			sbSql.append(" SELECT KK0351.OP_SVC_KEI_NO ");
			sbSql.append("   FROM KK_T_OP_SVC_KEI KK0351 ");
			sbSql.append("  WHERE KK0351.SVC_KEI_UCWK_NO = ? ");
			sbSql.append("    AND KK0351.OYA_KEI_SKBT_CD = '03' ");
			sbSql.append("    AND (KK0351.OP_SVC_KEI_NO, KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM) = ");
			sbSql.append("        (SELECT KK0351_GENE.OP_SVC_KEI_NO, MAX(KK0351_GENE.RSV_APLY_YMD || KK0351_GENE.GENE_ADD_DTM) AS GENE_DTM ");
			sbSql.append("           FROM KK_T_OP_SVC_KEI KK0351_GENE ");
			sbSql.append("          WHERE KK0351_GENE.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ");
			sbSql.append("            AND KK0351_GENE.RSV_APLY_YMD <= ? ");
			sbSql.append("            AND KK0351_GENE.RSV_APLY_CD = '2' ");
			sbSql.append("            AND KK0351_GENE.MK_FLG = '0' ");
			sbSql.append("          GROUP BY KK0351_GENE.OP_SVC_KEI_NO) ");
			sbSql.append("    AND KK0351.OP_SVC_CD = 'B015' ");
			sbSql.append("    AND KK0351.OP_SVC_KEI_STAT NOT IN ('910', '920') ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sbSql);

			// パラメータの設定(サービス契約内訳番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiUcwkNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			retList = new ArrayList<String>();
			// 取得結果を返却値に設定
			if (rsltQuery.next())
			{
				retList.add(rsltQuery.getString(KK0351ETMsg.OP_SVC_KEI_NO));
			}
		}
		catch (SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch (SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}

		return retList;
	}

	/**
	 * <p>
	 * 解約予約(オプションサービス契約)件数取得処理
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約番号に紐付く解約予約の件数
	 */
	private long getDlsRcvOpSvcKeiCnt(CAANMsg inMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		// 返却用件数
		long retCnt = 0L;
		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK1681ETMsg.getTableName());
			// SQL文
			StringBuffer sbSql = new StringBuffer();

			sbSql.append(" SELECT COUNT(*) AS CNT ");
			sbSql.append("   FROM KK_T_IDO_RSV KK1681 ");
			sbSql.append("  WHERE KK1681.OP_SVC_KEI_NO = ? ");
			sbSql.append("    AND KK1681.IDO_RSV_DTL_CD = '016' ");
			sbSql.append("    AND (KK1681.IDO_RSV_STAT_CD IN ('00', '03') ");
			sbSql.append("         OR (KK1681.IDO_RSV_STAT_CD = '04' ");
			sbSql.append("            AND KK1681.RSV_APLY_YMD > ? ) ");
			sbSql.append("        ) ");
			sbSql.append("    AND KK1681.MK_FLG = '0' ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sbSql);

			// パラメータの設定(オプションサービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, opSvcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 取得結果を返却値に設定
			if (rsltQuery.next())
			{
				retCnt = rsltQuery.getLong("CNT");
			}
		}
		catch (SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch (SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}

		return retCnt;
	}
	
	/**
	 * 対象日付未来日設定チェック(照査・締結済)処理
	 * <p>
	 * 対象日付が運用日付より未来日である且、対象となる「サービス契約」の
	 * サービス契約ステータスが「照査済」・「締結済」であるかのチェックを行う
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param tagYmd 対象日付
	 * @return 対象日付が運用日付よりも未来日である且紐付くサービス契約が"照査済"または"締結済"の場合、false。
	 *          上記以外の場合はtrue。
	 */
	public boolean isTagYmdFtrShosaTiktChk(CAANMsg inMsg, AgentDispatchContext inContext, Object tagYmd)
	{
		// 対象日付が過去日（当日を含む）の場合はtrueを返却
		if (JPCUtilCommon.isPastDate(tagYmd.toString(), JKKModelCommon.getOpeDate(inMsg), INC_DATE))
		{
			return true;
		}

		// オプションサービスに紐付くサービス契約カレントレコードを取得する
		CAANMsg retMsgKK0081 = new JKKejbKRCKCommon().getOyaKK0081(inMsg, inMsg);

		// カレントレコードが存在しない場合は例外エラーを発行する
		if (null == retMsgKK0081)
		{
			throw new JKKejbBusinessException("オプションサービス契約に紐付くサービス契約が取得できませんでした。");
		}

		// サービス契約のステータスが"照査済"または"締結済"の場合、falseを返却する
		if (JKKModelConst.SVC_KEI_STAT_SHOSA_ZM.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT))
				|| JKKModelConst.SVC_KEI_STAT_CNC_ZM.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT)))
		{
			return false;
		}
		
		// 親契約識別コードがサービス契約内訳の場合
		if (OYA_KEI_SKBT_CD_SVC_KEI_UCWK.equals(inMsg.getString(KK0351ETMsg.OYA_KEI_SKBT_CD)))
		{
			// サービス契約内訳のカレント検索を行う
			CAANMsg retKK0161 = getKK0161Crrent(inMsg, inMsg.getString(KK0351ETMsg.SVC_KEI_UCWK_NO));
			
			// 継続後契約変更手続中フラグが"変更手続中"の場合、falseを返却する
			if (!JKKModelConst.KEI_CHGECHU_FLG_NO_CHGECHU.equals(retKK0161.getString(KK0161ETMsg.KEIZK_AF_KEI_CHGECHU_FLG)))
			{
				return false;
			}
		}

		// それ以外の場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * フェムトセルオプション存在チェック
	 * </p>
	 * @param inETMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return フェムトセルオプションが存在する場合false 
	 */
	public boolean isChkSonzaiFemtOp(CAANMsg inETMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		return new JKKejbShosaChkBase().isChkSonzaiFemtOp(inETMsg, svcKeiNo);
	}

	/**
	 * <p>
	 * 同一オプション存在チェック処理
	 * </p>
	 * @param inETMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return サービス契約内訳番号に紐付くオプションサービス契約に入力値のオプションサービスコードが既に存在する場合、true。
	 */
	public boolean isChkSameOpSonzai(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		String opSvcCd = inMsg.getString(KK0351ETMsg.OP_SVC_CD);
		String svcKeiUcwkNo = inMsg.getString(KK0351ETMsg.SVC_KEI_UCWK_NO);
		return isChkSameOpSonzaiTrn(inMsg, opSvcCd, svcKeiUcwkNo);
	}


	/**
	 * <p>
	 * 同一オプション存在チェック処理
	 * </p>
	 * @param inETMsg 処理対象のメッセージキャリア
	 * @param opSvcCd オプションサービスコード
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return サービス契約内訳番号に紐付くオプションサービス契約に入力値のオプションサービスコードが既に存在する場合、true。
	 */
	private boolean isChkSameOpSonzaiTrn(CAANMsg inMsg, String opSvcCd, String svcKeiUcwkNo)
	{
		// オプションサービス契約取得時のオプションサービスコードを設定する
		HashMap<String, String[]> searchJknMap = new HashMap<String, String[]>();
		String[] paramOpSvcCd = new String[1];
		paramOpSvcCd[0] = opSvcCd;
		searchJknMap.put(KK0351ETMsg.OP_SVC_CD, paramOpSvcCd);

		CAANMsg[] retKK0351 = null;
		if (JKKModelConst.OP_SVC_CD_050_NUMBER_PLUS.equals(opSvcCd))
		{
			// ０５０ナンバープラスの場合は新旧2電話番号分のオプションサービス契約を取得する
			retKK0351 = new JKKejbKK0351DBABase().getKK0351bySvcKeiUcwkKeizkMt(svcKeiUcwkNo, searchJknMap, JKKModelCommon.getOpeDate(inMsg));
		}
		else
		{
			// オプションサービス契約を取得する
			retKK0351 = new JKKejbKK0351DBABase().getKK0351bySvcKeiUcwk(svcKeiUcwkNo, searchJknMap, JKKModelCommon.getOpeDate(inMsg));
		}
		// 取得できない場合
		if (null == retKK0351)
		{
			return false;
		}

		// 解約済、キャンセル済を除外する
		CAANMsg[] retKK0351Tg = new JKKejbKK0351DBABase().getKK0351OutDsLCl(retKK0351);

		// 除外した結果、レコードが存在しない場合
		if (null == retKK0351Tg || 0 == retKK0351Tg.length)
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 同一オプション存在チェック処理(回復)
	 * </p>
	 * @param inETMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return サービス契約内訳番号に紐付くオプションサービス契約に入力値のオプションサービスコードが既に存在する場合、true。
	 */
	public boolean isChkSameOpSonzaiKihk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = new JKKejbKK0351DBABase().findByCurrent(inETMsg);

		// 検索結果がnullだった場合はfalseを返却
		if (ret0351 == null)
		{
			return false;
		}

		String opSvcCd = ret0351.getString(KK0351ETMsg.OP_SVC_CD);
		String svcKeiUcwkNo = ret0351.getString(KK0351ETMsg.SVC_KEI_UCWK_NO);

		// サービス契約取得処理(サービス契約内訳番号)
		CAANMsg ret0081 = getSvcKeiSvcKeiUcwkNo(inMsg, svcKeiUcwkNo);
		
		// 取得できない場合
		if (null == ret0081)
		{
			return false;
		}

		// サービスコード取得処理
		String svcCd = ret0081.getString(KK0081ETMsg.SVC_CD);

		// 電話サービス以外の場合
		if (!SVC_CD_TEL.equals(svcCd))
		{
			return false;
		}

		return isChkSameOpSonzaiTrn(inMsg, opSvcCd, svcKeiUcwkNo);
	}

	/**
	 * <p>
	 * Ｍｙホームページオプション回復可否チェック処理<br>
	 * 1.同一「サービス契約」配下において、直近で解約されたＭｙホームページであること。<br>
	 * 2.同一「サービス契約」配下に、使用中のＭｙホームページが存在しないこと。<br>
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true:Ｍｙホームページオプション回復可、false:Ｍｙホームページオプション回復不可
	 */
	public boolean isMyHPOpKaihkKhChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 入力.異動区分が"オプション設定"以外の場合、チェック対象外
		if (!IDO_DIV_OPSET.equals(inMsg.getString(KK0351ETMsg.IDO_DIV)))
		{
			return true;
		}
		
		// 入力.オプションサービス契約番号
		String opSvcKeiNo = inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
		
		// 回復対象の「オプションサービス契約」が"Ｍｙホームページ"以外の場合、チェック対象外
		if (!isOpSvcCdChk(inMsg, inContext, opSvcKeiNo, OP_SVC_CD_MHP))
		{
			return true;
		}
		
		/* --------------------------------------------------------------------------------
		 * 同一「サービス契約」配下の「オプションサービス契約」(Ｍｙホームページ)取得
		 * -------------------------------------------------------------------------------- */
		// 回復対象の「オプションサービス契約」の親「サービス契約」(サービス契約番号)を取得する
		String svcKeiNo = getOyaSvcKeiNo(inMsg);
		if (null == svcKeiNo)
		{
			throw new JKKejbBusinessException("「オプションサービス契約」の親「サービス契約」が取得できません。");
		}
		
		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inMsg);
		// 個別検索条件マップ
		HashMap<String, String[]> searchJknMap = new HashMap<String, String[]>();
		// 追加検索条件：オプションサービス契約.オプションサービスコード = "Ｍｙホームページ"
		String [] opSvcCdList = {OP_SVC_CD_MHP};
		searchJknMap.put(KK0351ETMsg.OP_SVC_CD, opSvcCdList);
		
		// 同一「サービス契約」配下の「オプションサービス契約」(Ｍｙホームページ)を取得する
		JKKejbKK0351DBABase kk0351Dba = new JKKejbKK0351DBABase();
		CAANMsg[] kk0351MsgList = kk0351Dba.getKK0351bySvcKei(svcKeiNo, searchJknMap, opeDate, "1");
		
		/* ----------------------------------------------------------------------------------------------------
		 * 回復可否チェック１(同一「サービス契約」配下において、直近で解約されたＭｙホームページであること)
		 * ---------------------------------------------------------------------------------------------------- */
		// 最終サービス解約年月日
		String lastSvcDslYmd = null;
		// 最後に解約された「オプションサービス契約」(Ｍｙホームページ)のオプションサービス契約番号
		String lastDslOpSvcKeiNo = null;
		// 最後に解約された「オプションサービス契約」(Ｍｙホームページ)の世代登録年月日時分秒
		String lastDslGeneAddDtm = null;
		
		for (CAANMsg kk0351Msg : kk0351MsgList)
		{
			// オプションサービス契約ステータスが"解約済"以外の場合は対象外
			if (!JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
			{
				continue;
			}
			
			// サービス解約年月日
			String svcDslYmd = kk0351Msg.getString(KK0351ETMsg.SVC_DSL_YMD);
			if (svcDslYmd == null || "".equals(svcDslYmd))
			{
				throw new JKKejbBusinessException("解約済の「オプションサービス契約」に解約年月日が設定されていません。");
			}
			
			// 世代登録年月日時分秒
			String geneAddDtm = kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM);
			
			// サービス解約年月日が保持している日付より直近の場合は更新する(初回は無条件)
			// ※サービス解約年月日が同日の場合は、世代登録年月日時分秒が大きい方を優先するため、サービス解約年月日と世代登録年月日時分秒を連結して比較する。
			if (lastSvcDslYmd == null || (lastSvcDslYmd.concat(lastDslGeneAddDtm)).compareTo(svcDslYmd.concat(geneAddDtm)) < 0)
			{
				lastSvcDslYmd = svcDslYmd;
				lastDslGeneAddDtm = geneAddDtm;
				lastDslOpSvcKeiNo = kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
			}
		}
		
		// 回復対象の「オプションサービス契約」が直近で解約されたＭｙホームページと異なる場合、エラー
		if (lastSvcDslYmd != null && !opSvcKeiNo.equals(lastDslOpSvcKeiNo))
		{
			return false;
		}
		
		/* ----------------------------------------------------------------------------------------------------
		 * 回復可否チェック２(同一「サービス契約」配下に、使用中のＭｙホームページが存在しないこと)
		 * ---------------------------------------------------------------------------------------------------- */
		for (CAANMsg kk0351Msg : kk0351MsgList)
		{
			// オプションサービス契約ステータスが"解約済"、"キャンセル済"の場合は対象外
			if (JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_STAT))
					|| JKKModelConst.SVC_KEI_STAT_CNCL_ZM.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
			{
				continue;
			}
			
			// オプションサービス契約<ISP>を取得する。
			CAANMsg kk0361Msg = findPrimaryKK0361(kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_NO), kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));
			if (kk0361Msg == null)
			{
				throw new JKKejbBusinessException("同一世代の「オプションサービス契約<ISP>」が取得できません。");
			}
			
			// オプションサービス契約<ISP>.URL(アカウント)が設定されている場合、エラー
			if (!kk0361Msg.isNull(KK0361ETMsg.URL_ACCOUNT))
			{
				return false;
			}
		}
		
		return true;
	}

	/**
	 * <p>
	 * サービス契約カレント検索
	 * </p>
	 * @param inETMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約のカレントレコード
	 */
	private CAANMsg getKK0081Current(CAANMsg inMsg, String svcKeiNo)
	{
		// サービス契約のカレント検索を行う
		CAANMsg inETMsgKK0081 = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsgKK0081.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		inETMsgKK0081.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		return new JKKejbKK0081DBABase().findByCurrent(inETMsgKK0081);
	}
	
	/**
	 * <p>
	 * サービス契約内訳カレント検索
	 * </p>
	 * @param inETMsg 処理対象のメッセージキャリア
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return サービス契約内訳のカレントレコード
	 */
	private CAANMsg getKK0161Current(CAANMsg inMsg, String svcKeiUcwkNo)
	{
		// サービス契約内訳のカレント検索を行う
		CAANMsg msg = new CAANMsg(KK0161ETMsg.class.getName());
		msg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		msg.set(KK0161ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		return new JKKejbKK0161DBABase().findByCurrent(msg);
	}
	
	/**
	 * <p>
	 * サービス契約取得処理(サービス契約内訳番号)
	 * </p>
	 * @param inETMsg 処理対象のメッセージキャリア
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return サービス契約カレントレコード
	 */
	private CAANMsg getSvcKeiSvcKeiUcwkNo(CAANMsg inMsg, String svcKeiUcwkNo)
	{
		// サービス契約内訳カレント検索
		CAANMsg ret0161 = getKK0161Current(inMsg, svcKeiUcwkNo);
		if (null == ret0161)
		{
			return null;
		}
		// サービス契約カレント検索し返却する
		return getKK0081Current(inMsg, ret0161.getString(KK0161ETMsg.SVC_KEI_NO));

	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>の一意検索を行う。
	 * </p>
	 * @param opSvcKeiNo オプションサービス契約.オプションサービス契約番号
	 * @param geneAddDtm オプションサービス契約.世代登録年月日時分秒
	 * @return オプションサービス契約<ISP>レコード
	 */
	private CAANMsg findPrimaryKK0361(String opSvcKeiNo, String geneAddDtm)
	{
		// 一意検索用のメッセージを作成
		CAANMsg inETMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
		inETMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0361.set(KK0361ETMsg.GENE_ADD_DTM, geneAddDtm);

		// オプションサービス契約<ISP>の一意検索を行う
		return new JKKejbKK0361DBABase().findByPrimaryKey(inETMsgKK0361);
	}

	/**
	 * 子オプション解約時親オプション未解約チェック処理
	 * <p>
	 * 子オプションのサービス終了年月日が、親オプションのサービス開始年月日とサービス終了年月日の範囲内に存在しているかどうかの判断を行う
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 子オプションのサービス終了年月日が親オプションのサービス開始・終了年月日の範囲に存在する場合、true。
	 *          上記以外の場合はfalse。
	 */
	public boolean isSbopDslOpNotDslChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbKK0351KRCK#isSbopDslOpNotDsl");

		JKKejbKK0351DBABase kk0351dba = new JKKejbKK0351DBABase();

		String opSvcKeiNo = inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// 対象の「サブオプションサービス契約」の親「オプションサービス契約」のカレントレコードを取得
		CAANMsg kk0351Msg = kk0351dba.getKK0351Current(opSvcKeiNo, opeDate);

		// オプションサービス契約.サービス開始年月日
		String kk0351SvcStaymd = kk0351Msg.getString(KK0351ETMsg.SVC_STAYMD);
		// オプションサービス契約.サービス終了年月日
		String kk0351SvcEndymd = kk0351Msg.getString(KK0351ETMsg.SVC_ENDYMD);
		// 該当の「オプションサービス契約」が【締結済】(サービス開始年月日、サービス終了年月日が未設定)の場合、チェック対象外
		if ((kk0351SvcStaymd == null || "".equals(kk0351SvcStaymd)) || (kk0351SvcEndymd == null || "".equals(kk0351SvcEndymd)))
		{
			return true;
		}

		// IT1-2018-0000186 ADD START
		// オプションサービスコードを比較し、ＰＣプランの場合はチェックしない
		if (OP_SVC_CD_B133.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}
		// IT1-2018-0000186 ADD END

		// オプションサービス契約.サービス開始年月日≦入力(サブオプションサービス契約).サービス終了年月日≦オプションサービス契約.サービス終了年月日
		// の場合、チェックＯＫ
		if (JPCUtilCommon.isFutureDate(inMsg.getString(KK0401ETMsg.SVC_ENDYMD), kk0351SvcStaymd, INC_DATE))
		{
			if (JPCUtilCommon.isPastDate(inMsg.getString(KK0401ETMsg.SVC_ENDYMD), kk0351SvcEndymd, INC_DATE))
			{
				return true;
			}
		}

		// 上記以外の場合、チェックＮＧ
		return false;
	}

	/**
	 * 子オプションサービス契約自動解約チェック処理
	 * <p>
	 * オプションサービス番号に紐付くサブオプションサービスが、自動解約されるかの判断を行う
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 子オプションサービス契約に自動解約されるものが存在する場合、true
	 *          上記以外の場合はfalse。
	 */
	public boolean isSubOptSvcKeiAutoCncl(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbKK0351KRCK#isSubOptSvcKeiAutoCncl");

		JKKejbKK0351DBABase kk0351dba = new JKKejbKK0351DBABase();
		JKKejbKK0401DBABase kk0401dba = new JKKejbKK0401DBABase();

		String opSvcKeiNo = inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// 対象の「オプションサービス契約」のカレントレコードを取得
		CAANMsg kk0351Msg = kk0351dba.getKK0351Current(opSvcKeiNo, opeDate);

		// 対象の「オプションサービス契約」が"転送電話"、"発信者番号表示"以外の場合、チェック対象外
		if (!JKKModelConst.OP_SVC_CD_TENSO_TEL.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD))
				&& !JKKModelConst.OP_SVC_CD_HSNSH_NO_DSP.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return false;
		}

		// 対象の「オプションサービス契約」配下の「サブオプションサービス契約」を取得する。
		CAANMsg[] kk0401MsgList = kk0401dba.getKK0401byOpSvcKei(opSvcKeiNo, null, opeDate);
		for (CAANMsg kk0401Msg : kk0401MsgList)
		{
			// サブオプションサービス契約ステータスが"締結済"、"サービス提供中"、"休止・中断中"の場合、自動解約対象
			String sbopSvcKeiStat = kk0401Msg.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT);
			if (JKKModelConst.SVC_KEI_STAT_CNC_ZM.equals(sbopSvcKeiStat)
					|| JKKModelConst.SVC_KEI_STAT_SVCTK_CHU.equals(sbopSvcKeiStat)
					|| JKKModelConst.SVC_KEI_STAT_PAUSE_STP_CHU.equals(sbopSvcKeiStat))
			{
				return true;
			}
		}

		// 自動解約対象の「サブオプションサービス契約」が存在しない場合
		return false;
	}

	/**
	 * <p>
	 * 日付妥当性チェックを行います。
	 * 指定した日付に対し、開始日・終了日の妥当性を判定します。
	 * </p>
	 * @param inMsg 処理対象のメッセージ
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param itemNm  項目名
	 * @param tagYmd  対象日付
	 * @return 対象日付≦カレントレコードの終了日の場合はtrue。
	 *          対象日付＞カレントレコードの終了日の場合はfalse。
	 */
	public boolean checkDate(CAANMsg inMsg, String opSvcKeiNo, String itemNm, String tagYmd)
	{
		// オプションサービス契約番号が設定されている場合は処理を行う
		if (null == opSvcKeiNo)
		{
			return true;
		}
		// 対象日付が設定されていない場合は処理を行わない
		if (null == tagYmd)
		{
			return true;
		}
		
		// カレント検索用のメッセージを作成
		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 ret0351 = new JKKejbKK0351DBABase().findByCurrent(inETMsg);

		// 検索結果がnullだった場合はfalseを返却
		if (ret0351 == null)
		{
			return false;
		}

		// 比較対象の終了日がnullだった場合は処理しない
		if (ret0351.isNull(itemNm))
		{
			return true;
		}

		// 対象日付 ＞ カレントレコードの同項目の場合はfalseを返却する
		if (JPCUtilCommon.isFutureDate(tagYmd, ret0351.getString(itemNm), NO_INC_DATE))
		{
			return false;
		}
		return true;
	}

	/**
	 * <p>
	 * オプション契約の上限値のチェックを行います。(通常版)
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcCd 対象のオプションサービスコード
	 * @return true:チェックＯＫ、false:チェックＮＧ
	 */
	public boolean isNotOverLimitOp(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcCd)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "CALL: JKKejbKRCKCommon#isNotOverLimitOp");

		// 対象の「オプションサービス契約」の親「サービス契約」を取得する。
		CAANMsg kk0081Msg = new JKKejbKK0081DBABase().getKK0081byOpSvcKei(inMsg, JKKModelCommon.getOpeDate(inMsg));

		// 住所変更明細の取得
		JKKejbKK2101DBABase kk2101dba = new JKKejbKK2101DBABase();
		CAANMsg[] adchgList = kk2101dba.getKK2101byVariKei(JKKModelConst.ADCHG_DTL_SBT_CD_SVKEI_NO, null, null, kk0081Msg.getString(KK0081ETMsg.SVC_KEI_NO), "1");
		
		int lDataCnt = 0;
		
		// 住所変更明細が取得できておりかつ、変更前識別番号と変更後識別番号が異なる場合、
		// 解約／新規と判断して、引継ぎ対象のオプションサービス契約を取得する、
		if(adchgList != null && adchgList.length != 0)
		{
			String chbfSkbtNo = adchgList[0].getString(KK2101ETMsg.CHBF_SKBT_NO);
			String chafSkbtNo = adchgList[0].getString(KK2101ETMsg.CHAF_SKBT_NO);

			if(chbfSkbtNo != null && chafSkbtNo != null && !chafSkbtNo.equals(chbfSkbtNo))
			{
				String adchgNo = adchgList[0].getString(KK2101ETMsg.ADCHG_NO);
				lDataCnt = (int)getAdchgCount(inMsg, inContext, adchgNo, opSvcCd);
			}
		}
		
		// コース変更の異動予約が存在する場合、新旧2つのマルチセッションが作成されともにSOD送信対象となる。
		// これを許容するためにこれから申し込むオプションサービスを足しこまない。
		List<Map<String, String>> idoRsvCrsChgList = new JKKejbKK1681DBABase().getIdoRsvCrsChgList(kk0081Msg.getString(KK0081ETMsg.SVC_KEI_NO), JKKModelCommon.getOpeDate(inMsg));
		if ((JKKModelConst.OP_SVC_CD_MLTISE.equals(opSvcCd) || JKKModelConst.OP_SVC_CD_KOTEI_GLOBAL_IPAD.equals(opSvcCd)) && idoRsvCrsChgList.size() > 0)
		{
			;
		}
		else 
		{
			// これから申し込むオプションサービスを足しこむ
			lDataCnt = lDataCnt + 1;
		}

		// 20141110 ANK-2184-00-00 Update Start
		//return isOpSvcKeiUpplCntChk(kk0081Msg, (String)opSvcCd, null, null, lDataCnt);
		return isOpSvcKeiUpplCntChk(kk0081Msg, (String)opSvcCd, null, null, null, lDataCnt);
		// 20141110 ANK-2184-00-00 Update End
	}

	/**
	 * <p>
	 * オプション契約上限チェック処理を行います。(フェムトセルオプション)<br>
	 * 通常のオプション契約上限チェックとは異なり、フェムトセル事業者(au、SBM、など)毎に上限チェックを行う必要があるため。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true：チェックOK  false：チェックNG
	 */
	public boolean isNotOverLimitOpFmt(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// オプションサービス契約のフェムトセル事業者コードを取得する
		CAANMsg inETMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
		inETMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0361ETMsg.OP_SVC_KEI_NO));

		CAANMsg ret0361 = new JKKejbKK0361DBABase().findByCurrent(inETMsgKK0361);
		
		// フェムトセル事業者コードが0件およびnullの場合
		if (ret0361 == null || ret0361.isNull(KK0361ETMsg.FMTCEL_JGS_CD))
		{
			return true;
		}

		// 対象の「オプションサービス契約」の親「サービス契約」を取得する。
		CAANMsg kk0081Msg = new JKKejbKK0081DBABase().getKK0081byOpSvcKei(inMsg, JKKModelCommon.getOpeDate(inMsg));

		// 20141110 ANK-2184-00-00 Update Start
		//return isOpSvcKeiUpplCntChk(kk0081Msg, JKKModelConst.OP_SVC_CD_FMTCEL, null, ret0361.getString(KK0361ETMsg.FMTCEL_JGS_CD), 1);
		return isOpSvcKeiUpplCntChk(kk0081Msg, JKKModelConst.OP_SVC_CD_FMTCEL, null, ret0361.getString(KK0361ETMsg.FMTCEL_JGS_CD), inMsg.getString(KK0351ETMsg.PCRS_CD), 1);
		// 20141110 ANK-2184-00-00 Update End
	}

	
	/**
	 * <p>
	 * オプション契約の上限値のチェックを行います。(サービス契約料金プラン変更時)<br>
	 * 親「サービス契約」の料金プラン変更に伴い、配下の「オプションサービス契約」が
	 * 新料金コースに紐づく「料金コース_オプションサービス」の最大オプションサービス数を超過しないかチェックする。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true:チェックＯＫ、false:チェックＮＧ
	 */
	public boolean isNotOverLimitOpKK0081(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 20141110 ANK-2184-00-00 Update Start
		//return isOpSvcKeiUpplCntChk(inMsg, null, null, null, 0);
		return isOpSvcKeiUpplCntChk(inMsg, null, null, null, null, 0);
		// 20141110 ANK-2184-00-00 Update End
	}

	/**
	 * <p>
	 * オプション契約上限チェック共通処理
	 * </p>
	 * @param kk0081Msg 処理対象の「サービス契約」メッセージキャリア
	 * @param chkTgOpSvcCd チェック対象オプションサービスコード(全てのオプションをチェック対象とする場合はNULLを設定すること。)
	 * @param chkTgGaiMskmDtlNo チェック対象外申込明細番号(同一「申込明細」かによらずチェック対象とする場合はNULLを設定すること。)
	 * @param fmtcelJgsCd フェムトセル事業者コード(フェムトセルオプションの場合のみ設定)
	 * @param fmtcelPcrsCd フェムトセル料金コースコード（フェムトセルオプションの場合のみ設定）
	 * @param addOpKeiCnt 追加オプション契約数
	 * @return true:チェックＯＫ、false:チェックＮＧ
	 */
	// 20141110 ANK-2184-00-00 Update Start
	//private boolean isOpSvcKeiUpplCntChk(CAANMsg kk0081Msg, String chkTgOpSvcCd, String chkTgGaiMskmDtlNo, String fmtcelJgsCd, int addOpKeiCnt)
	private boolean isOpSvcKeiUpplCntChk(CAANMsg kk0081Msg, String chkTgOpSvcCd, String chkTgGaiMskmDtlNo, String fmtcelJgsCd, String fmtcelPcrsCd, int addOpKeiCnt)
	// 20141110 ANK-2184-00-00 Update Start
	{
		JKKejbKK0351DBABase kk0351dba = new JKKejbKK0351DBABase();
		JKKejbKK0361DBABase kk0361dba = new JKKejbKK0361DBABase();
		JKKejbKK0811DBABase kk0811dba = new JKKejbKK0811DBABase();
		String svcKeiNo = kk0081Msg.getString(KK0081ETMsg.SVC_KEI_NO);
		String pcrsCd = kk0081Msg.getString(KK0081ETMsg.PCRS_CD);
		String opeDate = JKKModelCommon.getOpeDate(kk0081Msg);

		// 該当の「サービス契約」配下の「オプションサービス契約」を取得する。
		CAANMsg[] kk0351MsgList = kk0351dba.getKK0351bySvcKei(svcKeiNo, null, opeDate, "3");

		// 解約済、キャンセル済を除外する
		kk0351MsgList = kk0351dba.getKK0351OutDsLCl(kk0351MsgList);

		/* --------------------------------------------------
		 * オプションサービス毎に契約数をカウントする。
		 * -------------------------------------------------- */
		Map<String, Long> opSvcMap = new HashMap<String, Long>();
		for (CAANMsg kk0351Msg : kk0351MsgList)
		{
			String opSvcCd = kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD);

			// チェック対象オプションサービスコードの指定がある場合
			if (chkTgOpSvcCd != null)
			{
				// 指定オプション以外はカウント対象外
				if (!chkTgOpSvcCd.equals(opSvcCd))
				{
					continue;
				}
			}
			
			// フェムトセルオプションの場合
			if (JKKModelConst.OP_SVC_CD_FMTCEL.equals(opSvcCd))
			{
				// チェック対象のフェムトセル事業所コードが未設定の場合対象外
				if (fmtcelJgsCd == null) {
					continue;
				}
				
				// 20141110 ANK-2184-00-00 Add Start
				// チェック対象のフェムトセルの料金コースコードが未設定の場合
				// または、料金コースコードが異なる場合はカウント対象外
				if (fmtcelPcrsCd == null ||
					!fmtcelPcrsCd.equals(kk0351Msg.getString(KK0351ETMsg.PCRS_CD)))
				{
					continue;
				}
				// 20141110 ANK-2184-00-00 Add End
				
				// 対象の「オプションサービス契約<ISP>」を取得する。
				CAANMsg kk0361Msg = kk0361dba.getKK0361Primary(
						kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_NO), kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));

				// フェムトセル事業者コードが異なる「オプションサービス契約」はカウント対象外
				// ※フェムトセル事業者(au、SBM、など)毎にオプション契約可能なため。
				if (!fmtcelJgsCd.equals(kk0361Msg.getString(KK0361ETMsg.FMTCEL_JGS_CD)))
				{
					continue;
				}
			}

			if (opSvcMap.containsKey(opSvcCd))
			{
				opSvcMap.put(opSvcCd, opSvcMap.get(opSvcCd).longValue() + 1);
			}
			else
			{
				opSvcMap.put(opSvcCd, new Long(1L));
			}
		}

		/* --------------------------------------------------
		 * オプションサービス契約数上限チェック
		 * -------------------------------------------------- */
		for (String opSvcCd : opSvcMap.keySet())
		{
			// オプション契約数
			long opKeiCnt = opSvcMap.get(opSvcCd).longValue() + addOpKeiCnt;

			// サービス契約.料金コースコード、オプションサービス契約.オプションサービスコードに紐づく「料金コース_オプションサービス」を取得する。
			CAANMsg[] kk0811MsgList = kk0811dba.getKK0811byPcrs_OpSvc(pcrsCd, opSvcCd, opeDate);

			// オプション契約数 ＞ 料金コース_オプションサービス.最大オプションサービス数 の場合、チェックエラー
// ▽▽▽ ANK-3412-00-00 Modify START
//			String maxOpSvcCnt = kk0811MsgList[0].getString(KK0811ETMsg.MAX_OP_SVC_CNT);
			String maxOpSvcCnt = "0"; 
			if (kk0811MsgList != null && kk0811MsgList.length > 0)
			{
				 maxOpSvcCnt = kk0811MsgList[0].getString(KK0811ETMsg.MAX_OP_SVC_CNT);
			}
// ▲▲▲ ANK-3412-00-00 Modify END
			if (!"".equals(maxOpSvcCnt) && Long.valueOf(maxOpSvcCnt) < opKeiCnt)
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * <p>
	 * 住所変更明細のオプションサービス契約のデータを取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param getAdchgCount 住所変更番号
	 * @param opSvcCd 対象のオプションサービスコード
	 * @return オプションサービス契約のデータ件数
	 */
	private long getAdchgCount(CAANMsg inMsg, AgentDispatchContext inContext, Object adchgNo ,Object opSvcCd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		long lDataCnt = 0L;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT ")
					.append("    COUNT(*) AS CNT ")
					.append("FROM ")
					.append("    KK_T_ADCHG_DTL KK2101 ")
					.append("INNER JOIN KK_T_OP_SVC_KEI KK0351 ")
					.append("ON KK0351.OP_SVC_KEI_NO = KK2101.CHAF_SKBT_NO ")
					.append("WHERE ")
					.append("    KK2101.ADCHG_NO = ? ")
					.append("    AND KK2101.ADCHG_DTL_SBT_CD = '04' ")
					.append("    AND KK2101.CHBF_SKBT_NO =  KK2101.CHAF_SKBT_NO")
					.append("    AND KK0351.OP_SVC_KEI_STAT IN ('010', '020', '030', '100', '210', '220') ")
					.append("    AND KK0351.OP_SVC_CD = ? ")
					.append("    AND (KK0351.OP_SVC_KEI_NO, KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM) = ")
					.append("        (SELECT KK0351_GENE.OP_SVC_KEI_NO, MAX(KK0351_GENE.RSV_APLY_YMD || KK0351_GENE.GENE_ADD_DTM) AS KK0351_MAX ")
					.append("         FROM   KK_T_OP_SVC_KEI KK0351_GENE ")
					.append("         WHERE  KK0351_GENE.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ")
					.append("         AND    KK0351_GENE.RSV_APLY_YMD <= ? ")
					.append("         AND    KK0351_GENE.RSV_APLY_CD = '2' ")
					.append("         AND    KK0351_GENE.MK_FLG= '0' ")
					.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, adchgNo.toString());
			// パラメータの設定(オプションサービスコードを指定)
			CAANJDBCUtil.setParam(pstmt, 2, opSvcCd.toString());
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 件数を返却する
			if (rsltQuery.next())
			{
				lDataCnt = rsltQuery.getLong("CNT");
			}

		}
		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 lDataCnt;
	}
}
