/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0351C011KRCK
*   ソースファイル名：JEKK0351C011KRCK.java
*   作成者          ：富士通
*   日付            ：2012年06月08日
*＜機能概要＞
*   オプションサービス引継チェックの関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2012/06/08  富士通      新規作成
*   v4.00.00    2012/03/09  FJ)寺本     xxxxxxxx
*   v4.00.01    2012/04/15  FJ)沖田     IT2-2013-0000375
*   v5.00.00    2013/07/21  FJ)寺本     IT1-2013-0001434
*   v5.00.01    2013/07/29  FJ)沖田     IT1-2013-0001544
*  v32.00.01    2017/04/25  FJ)三原     ANK-3149-00-00 セキュリティーパック導入
*  v55.00.00    2020/09/02  FJ)舘山     ANK-3754-17-00 5G・10G固定グローバルIP対応
*  v71.00.00    2024/04/26  FJ)渋谷	【ANK-4468-00-00】eo光ネット「シンプルプラン」追加対応
*  v72.00.00    2024/09/09  FJ)丸田	【ANK-4577-00-00】eo光ネット「シンプルプラン」追加対応(Step2)
**********************************************************************/

package eo.ejb.common.entity;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.constant.JKKStrConst;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0251ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0361ETMsg;
import eo.ejb.cbm.entity.KK0451ETMsg;
import eo.ejb.cbm.entity.KK0811ETMsg;
import eo.ejb.cbm.entity.KK1881ETMsg;
import eo.ejb.cbm.entity.KK2131ETMsg;
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.cbs.cbsmsg.EKK0351C011CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351C011CBSMsg1List;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0251DBABase;
import eo.ejb.common.db.JKKejbKK0351DBABase;
import eo.ejb.common.db.JKKejbKK0361DBABase;
import eo.ejb.common.db.JKKejbKK0811DBABase;
import eo.ejb.common.db.JKKejbZM0321DBAccess;

/**
 * <p>
 * オプションサービス引継チェックの関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0351C011KRCK
{

	/** 関連チェックエラーフラグ&エラー返却項目(未来日付範囲チェック) */
	private static final String[] KRCK_FUTURE_DATE_WNG = {"WA", EKK0351C011CBSMsg.OP_HKTGI_CHK_KKKU_FLG_1_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 最大登録数チェック) */
	private static final String[] KRCK_SVCKEI_MAX_ADD_ERR = {"EA", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 最大登録容量チェック) */
	private static final String[] KRCK_SVCKEI_MAX_ADD_CAPA_ERR = {"EB", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 登録可能オプションチェック) */
	private static final String[] KRCK_SVCKEI_ADD_VAL_OP_ERR = {"EC", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 未照査引継可否チェック) */
	private static final String[] KRCK_SVCKEI_NO_SHOSA_KH_ERR = {"ED", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 中心局コード一致チェック) */
	private static final String[] KRCK_SVCKEI_CENT_CD_MAT_ERR = {"EE", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 速度帯域チェック) */
	private static final String[] KRCK_SVCKEI_SPEED_AREA_ERR = {"EF", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 SOD発行状態チェック) */
	private static final String[] KRCK_SVCKEI_SOD_STAT_ERR = {"EG", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 有効メール存在チェック) */
	private static final String[] KRCK_SVCKEI_MAIL_VAL_WNG = {"WB", EKK0351C011CBSMsg.OP_HKTGI_CHK_KKKU_FLG_2_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 有効メール存在チェック（未来日）) */
	private static final String[] KRCK_SVCKEI_MAIL_VAL_FT_WNG = {"WC", EKK0351C011CBSMsg.OP_HKTGI_CHK_KKKU_FLG_3_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 ファミリーパックチェック) */
	private static final String[] KRCK_SVCKEI_FAM_PACK_WNG = {"WD", EKK0351C011CBSMsg.OP_HKTGI_CHK_KKKU_FLG_4_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 SYSIDチェック) */
	private static final String[] KRCK_SVCKEI_SYSID_WNG = {"WE", EKK0351C011CBSMsg.OP_HKTGI_CHK_KKKU_FLG_5_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 Myホームページ) */
	private static final String[] KRCK_SVCKEI_MYHP_ERR = {"EH", EKK0351C011CBSMsg.APLY_YMD_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 引継先サービス契約ステータスチェック) */
	private static final String[] KRCK_SVCKEI_OPHKTG_ERR = {"EI", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 引継元サービス契約ステータスチェック) */
	private static final String[] KRCK_SVCKEI_HKTGMOTO_STAT_ERR = {"EJ", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(オプションサービス契約 引継元オプションサービス契約ステータスチェック) */
	private static final String[] KRCK_OPSVCKEI_HKTGMOTO_STAT_ERR = {"EK", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(オプションサービス契約 引継元オプションサービス契約サービス提供物消去処理実施年月日時分秒チェック) */
	private static final String[] KRCK_OPSVCKEI_HKTGMOTO_SVCTK_BUT_DEL_TRN_JSSI_DTM_ERR = {"EL", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 予約登録可否チェック) */
	private static final String[] KRCK_SVCKEI_RSV_KH_ERR = {"EM", EKK0351C011CBSMsg.APLY_YMD_ERR};

	/** オプションサービスコード（Ｅメール） */
	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_MLLST = "B003";

	/** オプションサービスコード（固定グローバルIPアドレス） */
	private static final String OP_SVC_CD_GROV = "B004";

	/** サブオプションサービスコード（メール容量追加） */
	private static final String SBOP_SVC_CD_MLCP_ADD = "D02";

	/** サブオプションサービスコード（ホームページ容量追加） */
	private static final String SBOP_SVC_CD_HPCP_ADD = "D04";
	// 2017/04/25 ANK-3149-00-00 ADD START
	/** オプションサービスコード  インターネットサギウォール　ｆｏｒ　ｅｏ */
	private static final String OP_SVC_CD_INETSGWL = "B131";
	
	/** オプションサービスコード  ノートンファミリープレミア　ｆｏｒ　ｅｏ */
	private static final String OP_SVC_CD_NTFMLPRM = "B132";
	// 2017/04/25 ANK-3149-00-00 ADD END
	
	/** サービス契約ステータス（受付済） */
	private static final String SVC_KEI_STATUS_UK = "010";

	/** サービス契約ステータス（照査済） */
	private static final String SVC_KEI_STATUS_SHOSA = "020";

	/** サービス契約ステータス（解約済） */
	private static final String SVC_KEI_STATUS_DSL = "910";

	/** サービス契約ステータス（キャンセル済） */
	private static final String SVC_KEI_STATUS_CNCL = "920";

	/** 無効フラグ（有効） */
	private static final String MK_FLG_VALID = "0";

	/** 業務パラメータ（適用期間基準範囲） */
	private static final String WORK_PARAM_APLY_PSB_DAYS = "KK_APLY_PSB_DAYS";

	/** 最大登録数チェック用 処理対象オプションサービスコードリスト */
	private static final ArrayList<String> MAX_ADD_CHK_TAG_LSIT = new ArrayList<String>();

	static
	{
		MAX_ADD_CHK_TAG_LSIT.add(OP_SVC_CD_EML);
		MAX_ADD_CHK_TAG_LSIT.add(OP_SVC_CD_MHP);
		MAX_ADD_CHK_TAG_LSIT.add(OP_SVC_CD_MLLST);
		MAX_ADD_CHK_TAG_LSIT.add(OP_SVC_CD_GROV);
		// 2017/04/25 ANK-3149-00-00 ADD START
		MAX_ADD_CHK_TAG_LSIT.add(OP_SVC_CD_INETSGWL);
		MAX_ADD_CHK_TAG_LSIT.add(OP_SVC_CD_NTFMLPRM);
		// 2017/04/25 ANK-3149-00-00 ADD END
	}

	/**
	 * <p>
	 * 新しいJEKK0351C011KRCKを作成します。
	 * </p>
	 */
	public JEKK0351C011KRCK()
	{
	}

	/**
	 * <p>
	 * オプションサービス引継チェックの関連制約を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		// ANK-4468-00-00 ADD START
		// 機能コードが"2"の場合チェックを行わない
		if(!"2".equals(inCBSMsg.getString(EKK0351C011CBSMsg.FUNC_CODE)))
		{
		// ANK-4468-00-00 ADD END
			// 未来日付範囲チェック
			if (!isFutureDateChk(inCBSMsg, opeDate))
			{
				setErrInfo(inCBSMsg, StatusCodes.WARNING, KRCK_FUTURE_DATE_WNG);
			}
		// ANK-4468-00-00 ADD START
		}
		// ANK-4468-00-00 ADD END

		// 最大登録数チェック
		if (!isMaxAddChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_MAX_ADD_ERR);
			return;
		}

		// 最大登録容量チェック
		if (!isMaxCapaChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_MAX_ADD_CAPA_ERR);
			return;
		}

		// 登録可能オプションチェック
		if (!isAddValidOpChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_ADD_VAL_OP_ERR);
			return;
		}

		// 未照査引継可否チェック
		if (!isNoShosaKhChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_NO_SHOSA_KH_ERR);
			return;
		}

		// 中心局コード一致チェック
		if (!isCentCdMatchChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_CENT_CD_MAT_ERR);
			return;
		}

// ▼▼▼ ANK-3754-17-00 DEL START
//		// 速度帯域チェック
//		if (!isSpeedAreaChk(inCBSMsg, opeDate))
//		{
//			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_SPEED_AREA_ERR);
//			return;
//		}
// △△△ ANK-3754-17-00 DEL END

		// SOD発行状態チェック
		if (!isSodStatusChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_SOD_STAT_ERR);
			return;
		}

		// 有効メール存在チェック
		if (!isValidMailChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.WARNING, KRCK_SVCKEI_MAIL_VAL_WNG);
		}

		// 有効メール存在チェック（未来日）
		if (!isValidMailFutureChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.WARNING, KRCK_SVCKEI_MAIL_VAL_FT_WNG);
		}

		// ファミリーパックチェック
		if (!isFamilyPackChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.WARNING, KRCK_SVCKEI_FAM_PACK_WNG);
		}

		// SYSIDチェック
		if (!isSysidChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.WARNING, KRCK_SVCKEI_SYSID_WNG);
		}

		// オプション引継チェック
		if (!isOptionHktgiChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_OPHKTG_ERR);
			return;
		}

		// Myホームページチェック
		if (!isMyHamePageChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_MYHP_ERR);
			return;
		}

		// 引継元サービス契約ステータスチェック
		if (!isSvcKeiHktgiMtChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_HKTGMOTO_STAT_ERR);
			return;
		}

		// 引継元オプションサービス契約ステータスチェック
		if (!isOpSvcKeiStatusChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_OPSVCKEI_HKTGMOTO_STAT_ERR);
			return;
		}

		// 引継元オプションサービス契約サービス提供物消去処理実施年月日時分秒チェック
		if (!isHktgMtOpSvcSvctkButDelTrnJssiDtmChk(inCBSMsg, opeDate))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_OPSVCKEI_HKTGMOTO_SVCTK_BUT_DEL_TRN_JSSI_DTM_ERR);
			return;
		}

		// ANK-4468-00-00 ADD START
		// 機能コードが"2"の場合チェックを行わない
		if(!"2".equals(inCBSMsg.getString(EKK0351C011CBSMsg.FUNC_CODE)))
		{
		// ANK-4468-00-00 ADD END
			// 予約登録可否チェック
			if (!isRsvKhChk(inCBSMsg, opeDate))
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_RSV_KH_ERR);
				return;
			}
		// ANK-4468-00-00 ADD START
		}
		// ANK-4468-00-00 ADD END
	}


	// ***** 以下チェック内容メソッド *****

	/**
	 * <p>
	 * 引継元サービス契約ステータスチェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return オプション引継できない場合false。できる場合true。
	 */
	private boolean isSvcKeiHktgiMtChk(CAANMsg inCBSMsg, String opeDate)
	{
		// 引継元サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO))
		{
			return true;
		}

		// 引継元サービス契約番号に紐付く、サービス契約のカレントレコードを取得
		CAANMsg retMsgKK0081 = findByCurrentKK0081(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO), opeDate);

		// レコードが取得できなかった場合はfalseを返却
		if (null == retMsgKK0081)
		{
			return false;
		}

		// サービス契約ステータスが"210"(休止・中断中) or "220"(停止中) or "920"(キャンセル済)の場合はfalseを返却
		if (JKKModelConst.SVC_KEI_STAT_PAUSE_STP_CHU.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT))
				|| JKKModelConst.SVC_KEI_STAT_STP_CHU.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT))
				|| JKKModelConst.SVC_KEI_STAT_CNCL_ZM.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT)))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * 引継元オプションサービス契約ステータスチェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return オプション引継できない場合false。できる場合true。
	 */
	private boolean isOpSvcKeiStatusChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}

		// リストの各メッセージについてチェックを行う
		CAANMsg[] c011List = inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST);

		for (CAANMsg c011msg : c011List)
		{
			// 引継対象オプションサービス契約番号のカレントレコードを検索する
			CAANMsg retMsgKK0351 = findByCurrentKK0351(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_KEI_NO), opeDate);

			// カレントレコードが存在しない場合はfalseを返却
			if (null == retMsgKK0351)
			{
				return false;
			}

			// 引継元のオプションサービス契約ステータスが"920"（キャンセル済）の場合はfalseを返却
			if (JKKModelConst.SVC_KEI_STAT_CNCL_ZM.equals(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
			{
				return false;
			}
			
			// 引継元のオプションサービス契約ステータスが"910"（解約済）かつサービス解約理由コードが「引継解約」の場合はfalseを返却
			if (JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT)) && 
					JKKModelConst.SVC_DLRE_CD_HKTG_DSL.equals(retMsgKK0351.getString(KK0351ETMsg.SVC_DLRE_CD)))
			{
				return false;
			}
		}
		return true;
	}
	
	/**
	 * <p>
	 * 引継元オプションサービス契約サービス提供物消去処理実施年月日時分秒チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return オプション引継できない場合false。できる場合true。
	 */
	private boolean isHktgMtOpSvcSvctkButDelTrnJssiDtmChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}

		// リストの各メッセージについてチェックを行う
		CAANMsg[] c011List = inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST);

		for (CAANMsg c011msg : c011List)
		{
			// 引継対象オプションサービス契約番号のカレントレコードを検索する
			CAANMsg retMsgKK0351 = findByCurrentKK0351(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_KEI_NO), opeDate);

			// カレントレコードが存在しない場合はfalseを返却
			if (null == retMsgKK0351)
			{
				return false;
			}

			// 引継元のオプションサービス契約のサービス提供物消去処理実施年月日時分秒が未設定以外の場合はfalseを返却
			if (!(retMsgKK0351.isNull(KK0351ETMsg.SVCTK_BUT_DEL_TRN_JSSI_DTM)
					|| "".equals(retMsgKK0351.getString(KK0351ETMsg.SVCTK_BUT_DEL_TRN_JSSI_DTM))))
			{
				return false;
			}
		}
		return true;
	}

	/**
	 * <p>
	 * 予約登録可否チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return オプション引継できない場合false。できる場合true。
	 */
	private boolean isRsvKhChk(CAANMsg inCBSMsg, String opeDate)
	{
		// 引継先サービス契約番号または引継元サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO) || 
				!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO))
		{
			return true;
		}

		// 引継先サービス契約番号および引継元サービス契約番号に紐付く、サービス契約のカレントレコードを取得
		CAANMsg retMsgKK0081Sk = findByCurrentKK0081(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO), opeDate);
		CAANMsg retMsgKK0081Mt = findByCurrentKK0081(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO), opeDate);

		// レコードが取得できなかった場合はfalseを返却
		if (null == retMsgKK0081Sk || retMsgKK0081Mt == null)
		{
			return false;
		}

		// 引継先サービス契約かつ引継元サービス契約のサービス契約ステータスが"100"（サービス提供中）以外かつ入力.適用開始年月日＞運用日の場合はfalseを返却
		if (!(JKKModelConst.SVC_KEI_STAT_SVCTK_CHU.equals(retMsgKK0081Sk.getString(KK0081ETMsg.SVC_KEI_STAT))
				&& JKKModelConst.SVC_KEI_STAT_SVCTK_CHU.equals(retMsgKK0081Mt.getString(KK0081ETMsg.SVC_KEI_STAT)))
				&& JKKModelCommon.isFutureDate(inCBSMsg.getString(EKK0351C011CBSMsg.APLY_YMD), opeDate, "0"))
		{
			return false;
		}
		return true;
	}

	/**
	 * <p>
	 * 未来日付範囲チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 適用開始年月日が運用日から基準範囲を超えて未来日付の場合false。それ以外の場合true。
	 */
	private boolean isFutureDateChk(CAANMsg inCBSMsg, String opeDate)
	{
		// 適用開始年月日が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.APLY_YMD))
		{
			return true;
		}

		// 業務パラメータから適用期間基準範囲を取得
		String aplyDays = new JKKejbZM0321DBAccess().getParamE(WORK_PARAM_APLY_PSB_DAYS);

		// 業務パラメータから取得できなかった場合falseを返却
		if (null == aplyDays)
		{
			return false;
		}

		// 取得した基準範囲を「運用日付」に加算する
		String addDay = JKKModelCommon.addDay(opeDate, Integer.parseInt(aplyDays));

		// 入力値「適用開始年月日」 ＞ 算出値の場合、falseを返却
		if (JPCUtilCommon.isFutureDate(inCBSMsg.getString(EKK0351C011CBSMsg.APLY_YMD), addDay, "0"))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 最大登録数チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 選択されているオプションを引継登録した引継先で、オプション登録数をオーバーしていた場合false。それ以外の場合true。
	 */
	private boolean isMaxAddChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}

		// 引継先サービス契約番号、引継先料金コースコードが未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO, EKK0351C011CBSMsg.HKTGI_SK_PCRS_CD))
		{
			return true;
		}

		// 引継先サービス契約番号に紐付くオプションサービス契約の件数を取得
		HashMap<String, Long> retMapKK0351 = getKK0351IntentWithSvc(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO), opeDate);

		for (String opSvcCd: MAX_ADD_CHK_TAG_LSIT)
		{
			// オプション登録数算出用変数
			Long lngCulc = 0L;

			boolean opSvcCdFlg = false;
			// リスト内の対象オプションサービスに設定されているオプションについてのみ実施する。
			for (CAANMsg c011msg: inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST))
			{
				if (opSvcCd.equals(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD)))
				{
					lngCulc++;
					opSvcCdFlg = true;
				}
			}

			if (!opSvcCdFlg)
			{
				continue;
			}
			
			// 取得したオプションサービス契約の件数を加算する（データが存在しなかった場合は加算しない）
			if (retMapKK0351.containsKey(opSvcCd))
			{
				lngCulc += retMapKK0351.get(opSvcCd);
			}

			// 引継先料金コースコード、処理対象のオプションサービスコードに紐づく「料金コース_オプションサービス」を取得する
			JKKejbKK0811DBABase kk0811Dba = new JKKejbKK0811DBABase();
			CAANMsg[] retMsgKK0811 = kk0811Dba.getKK0811byPcrs_OpSvc(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_PCRS_CD), opSvcCd, opeDate);

			// レコードが存在しなかった場合はfalseを返却
			if (null == retMsgKK0811 || retMsgKK0811.length == 0)
			{
				return false;
			}

			// 最大オプションサービス数、無料オプションサービス数を取得
			Long lngMax = retMsgKK0811[0].getStringAsLong(KK0811ETMsg.MAX_OP_SVC_CNT);

			// オプション登録数 ＞ 最大オプションサービス数の場合はfalseを返却する
			if (lngCulc > lngMax)
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * <p>
	 * 最大登録容量チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 引継ぎ先で許容可能な容量を各オプションの容量がオーバーしていた場合false。それ以外の場合true。
	 */
	private boolean isMaxCapaChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}

		// 引継先料金コースコードが未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_SK_PCRS_CD))
		{
			return true;
		}

		// リストの各メッセージについてチェックを行う
		CAANMsg[] c011List = inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST);

		for (CAANMsg c011msg: c011List)
		{
			// 使用する項目を取得
			String opSvcKeiNo = c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_KEI_NO);
			String opSvcCd = c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD);

			// オプションサービスコード判定
			String sbopSvcCd = null;
			if (OP_SVC_CD_EML.equals(opSvcCd))
			{
				// Eメールの場合はメール容量追加のサブオプションを対象とする
				sbopSvcCd = SBOP_SVC_CD_MLCP_ADD;
			}
			else if (OP_SVC_CD_MHP.equals(opSvcCd))
			{
				// Myホームページの場合はホームページ容量追加のサブオプションを対象とする
				sbopSvcCd = SBOP_SVC_CD_HPCP_ADD;
			}
			else 
			{
				// それ以外の場合は対象外とする
				continue;
			}

			// サービス提供最大値を取得
			Long lngMaxValue = findByCondKK1881(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_PCRS_CD), sbopSvcCd, opeDate);

			// オプションサービス契約<ISP>のカレントレコードを取得
			CAANMsg inMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
			inMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);

			CAANMsg retMsgKK0361 = new JKKejbKK0361DBABase().findByCurrent(inMsgKK0361);

			// レコードが取得できなかった場合はfalseを返却
			if (null == retMsgKK0361)
			{
				return false;
			}

			Long lngCapa = 0L;
			
			if (!retMsgKK0361.isNull(KK0361ETMsg.CAPA))
			{
				// 容量が設定されている場合、値を取得する
				lngCapa = retMsgKK0361.getStringAsLong(KK0361ETMsg.CAPA);
			}

			// 容量 ＞ サービス提供最大値の場合はfalseを返却
			if (lngCapa > lngMaxValue)
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * <p>
	 * 登録可能オプションチェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 引継先サービスへの追加出来ないオプションを選択していた場合false。それ以外の場合true。
	 */
	private boolean isAddValidOpChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}

		// 引継元料金コースコード、引継先料金コースコードが未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_MT_PCRS_CD, EKK0351C011CBSMsg.HKTGI_SK_PCRS_CD))
		{
			return true;
		}

		// オプション引継可能条件のデータを取得
		ArrayList<String> retArray = findByCondKK2131(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_MT_PCRS_CD), inCBSMsg
				.getString(EKK0351C011CBSMsg.HKTGI_SK_PCRS_CD), opeDate);

		// リスト内の対象オプションサービスに、対象外のレコードが含まれていないかのチェック
		for (CAANMsg c011msg: inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST))
		{
			// ANK-4577-00-00 ADD START
			// 引継対象オプションサービスコードが
			// B021：リモートサポートプラス,B133：ＰＣプラン,B134：ＴＶプランいずれかに設定されている場合、スキップする。
			if (JKKStrConst.OP_SVC_CD_RMTSPRT_PLUS.equals(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD))
					|| JKKStrConst.OP_SVC_CD_PC_PLAN.equals(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD))
					|| JKKStrConst.OP_SVC_CD_TV_PLAN.equals(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD)))
			{
				continue;
			}
			// ANK-4577-00-00 ADD END
			// オプション引継可能条件の取得値以外のオプションサービスが存在した場合はfalseを返却
			if (!retArray.contains(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD)))
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * <p>
	 * 未照査引継可否チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 未照査のサービス契約へ解約済オプションを引継ごうとした場合false。それ以外の場合true。
	 */
	private boolean isNoShosaKhChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}

		// 引継先サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO))
		{
			return true;
		}

		// 引継先サービス契約番号に紐付く、サービス契約のカレントレコードを取得
		CAANMsg retMsgKK0081 = findByCurrentKK0081(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO), opeDate);

		// レコードが取得できなかった場合はfalseを返却
		if (null == retMsgKK0081)
		{
			return false;
		}

		// サービス契約ステータスが"010"（受付済）以外の場合はtrueを返却
		if (!SVC_KEI_STATUS_UK.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT)))
		{
			return true;
		}

		// リスト内のオプションサービス契約番号をキーとしてカレント検索を行う
		CAANMsg[] c011List = inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST);

		for (CAANMsg c011msg: c011List)
		{
			// 引継対象オプションサービス契約番号に紐付く、オプションサービス契約のカレントレコードを取得
			CAANMsg retMsgKK0351 = findByCurrentKK0351(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_KEI_NO), opeDate);

			// レコードが取得できなかった場合はfalseを返却
			if (null == retMsgKK0351)
			{
				return false;
			}

			// オプションサービス契約ステータスが"910"（解約済）、"920"（キャンセル済）の場合はfalseを返却
			if (SVC_KEI_STATUS_DSL.equals(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT))
					|| SVC_KEI_STATUS_CNCL.equals(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
			{
				return false;
			}
		}

		// 解約済のレコードが存在しなかった場合はtrueを返却する
		return true;
	}

	/**
	 * <p>
	 * 中心局コード一致チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 固定IPアドレスの場合、引継元・引継先の集約局コードが同一中心局コードである必要がある(集線局CD中心局CD変換マスタを照合)。
	 *          中心局コードが不一致の場合false。それ以外の場合true。
	 */
	private boolean isCentCdMatchChk(CAANMsg inCBSMsg, String opeDate)
	{
		// 引継先サービス契約番号、引継元サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO, EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO))
		{
			return true;
		}

		// リスト内に固定グローバルIPアドレスのオプションが存在するかをチェック
		if (!isOpSvcInList(inCBSMsg, OP_SVC_CD_GROV))
		{
			// 存在しない場合はtrueを返却
			return true;
		}

		// 引継元サービス契約番号に紐づく「サービス契約回線内訳」を取得する
		JKKejbKK0251DBABase kk0251Dba = new JKKejbKK0251DBABase();
		CAANMsg[] retMsgKK0251MtList = kk0251Dba.getKK0251bySvcKei(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO), null, opeDate, "1");

		// 対象のサービス契約回線内訳が存在しない場合はfalseを返却
		if (1 > retMsgKK0251MtList.length)
		{
			return false;
		}

		// 中心局コードを取得する（引継元）
		ArrayList<String> arrayCentMt = getCentCdByList(retMsgKK0251MtList);

		// 中心局コードが取得できなかった場合はfalseを返却
		if (1 > arrayCentMt.size())
		{
			return false;
		}

		// 引継先サービス契約番号に紐づく「サービス契約回線内訳」を取得する
		CAANMsg[] retMsgKK0251SkList = kk0251Dba.getKK0251bySvcKei(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO), null, opeDate, "1");

		// 対象のサービス契約回線内訳が存在しない場合はfalseを返却
		if (1 > retMsgKK0251SkList.length)
		{
			return false;
		}

		// 中心局コードを取得する（引継先）
		ArrayList<String> arrayCentSk = getCentCdByList(retMsgKK0251SkList);

		// 中心局コードが取得できなかった場合はfalseを返却
		if (1 > arrayCentSk.size())
		{
			return false;
		}

		// 取得した中心局コードのリストを結合する
		ArrayList<String> arrayCent = new ArrayList<String>();
		arrayCent.addAll(arrayCentMt);
		arrayCent.addAll(arrayCentSk);

		// 取得した中心局コードが全て同一であるかを確認
		String baseCent = arrayCent.get(0);
		for (int i = 1; i < arrayCent.size(); i++)
		{
			// 1件目を基準として、基準値と異なる値が存在した場合はfalseを返却
			if (!baseCent.equals(arrayCent.get(i)))
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * <p>
	 * 速度帯域チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 固定IPアドレスの場合、速度帯域が異なる場合false。それ以外の場合true。
	 */
	private boolean isSpeedAreaChk(CAANMsg inCBSMsg, String opeDate)
	{
		// 引継先サービス契約番号、引継元サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO, EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO))
		{
			return true;
		}

		// リスト内に固定グローバルIPアドレスのオプションが存在するかをチェック
		if (!isOpSvcInList(inCBSMsg, OP_SVC_CD_GROV))
		{
			// 存在しない場合はtrueを返却
			return true;
		}

		// 引継元サービス契約番号に紐付く、サービス契約のカレントレコードを取得
		CAANMsg retMsgKK0081Mt = findByCurrentKK0081(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO), opeDate);

		// レコードが取得できなかった場合はfalseを返却
		if (null == retMsgKK0081Mt)
		{
			return false;
		}

		// 引継先サービス契約番号に紐付く、サービス契約のカレントレコードを取得
		CAANMsg retMsgKK0081Sk = findByCurrentKK0081(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO), opeDate);

		// レコードが取得できなかった場合はfalseを返却
		if (null == retMsgKK0081Sk)
		{
			return false;
		}

		// 引継元、引継先の料金コースコードが異なる場合はfalseを返却
		if (!isParamCheck(retMsgKK0081Mt.getString(KK0081ETMsg.PCRS_CD), retMsgKK0081Sk.getString(KK0081ETMsg.PCRS_CD)))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * SOD発行状態チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 引継元のオプションがＳＯＤ未発行のものを引き継ごうとした場合false。それ以外の場合true。
	 */
	private boolean isSodStatusChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}

		// リストの各メッセージについてチェックを行う
		CAANMsg[] c011List = inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST);

		for (CAANMsg c011msg: c011List)
		{
			// 引継対象オプションサービス契約番号のカレントレコードを検索する
			CAANMsg retMsgKK0351 = findByCurrentKK0351(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_KEI_NO), opeDate);

			// カレントレコードが存在しない場合はfalseを返却
			if (null == retMsgKK0351)
			{
				return false;
			}

			// オプションサービス契約ステータスが"010"（受付済）の場合はfalseを返却
			if (SVC_KEI_STATUS_UK.equals(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
			{
				return false;
			}
			
			// Myホームページのみ
			if (OP_SVC_CD_MHP.equals(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD)))
			{
				// オプションサービス契約<ISP>の一意照会を行う
				CAANMsg retMsgKK0361 = findByPrimaryKeyKK0361(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_KEI_NO), retMsgKK0351
						.getString(KK0351ETMsg.GENE_ADD_DTM));

				// レコードが取得できなかった場合は次の明細へ
				if (null == retMsgKK0361)
				{
					continue;
				}

				// URL(アカウント)が設定されていない場合はfalseを返却
				if (retMsgKK0361.isNull(KK0361ETMsg.URL_ACCOUNT))
				{
					return false;
				}
			}

			// 固定グローバルIPアドレスのみ
			if (OP_SVC_CD_GROV.equals(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD)))
			{
				// 引継元サービス契約番号、引継元サービス契約内訳番号が未設定の場合は処理を行わない
				if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO, EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_UCWK_NO))
				{
					continue;
				}

				// オプションサービス契約ステータスが"020"（照査済）の場合はfalseを返却
				if (SVC_KEI_STATUS_SHOSA.equals(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
				{
					return false;
				}

				// オプションサービス契約<ISP>の一意照会を行う
				CAANMsg retMsgKK0361 = findByPrimaryKeyKK0361(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_KEI_NO), retMsgKK0351
						.getString(KK0351ETMsg.GENE_ADD_DTM));

				// レコードが取得できない又は固定IPアドレスが未設定の場合、falseを返却
				if (null == retMsgKK0361 || retMsgKK0361.isNull(KK0361ETMsg.KOTEI_IP_AD))
				{
					return false;
				}

			}
		}
		
		return true;
	}

	/**
	 * <p>
	 * 有効メール存在チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 当日引継ぎにおいて、引継ぎ対象のメールを除き、引継ぎ元にメールが存在しなくなる場合false。それ以外の場合true。
	 */
	private boolean isValidMailChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}

		// 適用開始年月日、引継元サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.APLY_YMD, EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO))
		{
			return true;
		}

		// 適用開始年月日が運用日付と同日でない場合はtrueを返却する
		if (!opeDate.equals(inCBSMsg.getString(EKK0351C011CBSMsg.APLY_YMD)))
		{
			return true;
		}

		// 有効メール存在チェック共通処理を呼び出す
		return isValidMailChkCommon(inCBSMsg, opeDate);
	}

	/**
	 * <p>
	 * 有効メール存在チェック（未来日）を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 引継ぎ元の引継ぎ対象以外のメールに、未来日指定のメールしか存在しなくなる場合false。それ以外の場合true。
	 */
	private boolean isValidMailFutureChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}

		// 適用開始年月日、引継元サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.APLY_YMD, EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO))
		{
			return true;
		}

		// 適用開始年月日が運用日付より未来日でない場合はtrueを返却する
		if (!JPCUtilCommon.isFutureDate(inCBSMsg.getString(EKK0351C011CBSMsg.APLY_YMD), opeDate, "0"))
		{
			return true;
		}

		// 有効メール存在チェック共通処理を呼び出す
		return isValidMailChkCommon(inCBSMsg, opeDate);
	}

	/**
	 * <p>
	 * ファミリーパックチェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 「Ｅメール」の引継ぎ時、引継ぎ元契約がファミリーパックありで、引継ぎ先契約がファミリーパックなしの場合false。それ以外の場合true。
	 */
	private boolean isFamilyPackChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}

		// 引継元サービス契約番号、引継先サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO, EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO))
		{
			return true;
		}

		// リスト内にEメールのオプションが存在するかをチェック
		if (!isOpSvcInList(inCBSMsg, OP_SVC_CD_EML))
		{
			// 存在しない場合はtrueを返却
			return true;
		}

		// 引継元サービス契約番号に紐付く、ファミリーパックの割引サービス契約件数を取得
		Long retLngMt = findByCondKK0451Family(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO), opeDate);

		// データが存在しなかった場合はtrueを返却
		if (retLngMt < 1)
		{
			return true;
		}

		// 引継先サービス契約番号に紐付く、ファミリーパックの割引サービス契約件数を取得
		Long retLngSk = findByCondKK0451Family(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO), opeDate);

		// データが存在しなかった場合はfalseを返却
		if (retLngSk < 1)
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * SYSIDチェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 引継元SYSIDと引継先SYSIDが異なる場合false。それ以外の場合true。
	 */
	private boolean isSysidChk(CAANMsg inCBSMsg, String opeDate)
	{
		// 引継元サービス契約番号、引継先サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO, EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO))
		{
			return true;
		}

		// 引継元サービス契約番号に紐付く、サービス契約のカレントレコードを取得
		CAANMsg retMsgKK0081Mt = findByCurrentKK0081(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO), opeDate);

		// レコードが取得できなかった場合はfalseを返却
		if (null == retMsgKK0081Mt)
		{
			return false;
		}

		// 引継先サービス契約番号に紐付く、サービス契約のカレントレコードを取得
		CAANMsg retMsgKK0081Sk = findByCurrentKK0081(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO), opeDate);

		// レコードが取得できなかった場合はfalseを返却
		if (null == retMsgKK0081Sk)
		{
			return false;
		}

		// 引継元、引継先のSYSIDが異なる場合はfalseを返却
		if (!isParamCheck(retMsgKK0081Mt.getString(KK0081ETMsg.SYSID), retMsgKK0081Sk.getString(KK0081ETMsg.SYSID)))
		{
			return false;
		}

		return true;
	}
	
	/**
	 * <p>
	 * 引継先サービス契約ステータスチェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return オプション引継できない場合false。できる場合true。
	 */
	private boolean isOptionHktgiChk(CAANMsg inCBSMsg, String opeDate)
	{
		// 引継先サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO))
		{
			return true;
		}

		// 引継先サービス契約番号に紐付く、サービス契約のカレントレコードを取得
		CAANMsg retMsgKK0081 = findByCurrentKK0081(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO), opeDate);

		// レコードが取得できなかった場合はfalseを返却
		if (null == retMsgKK0081)
		{
			return false;
		}

		// サービス契約ステータスが"910"（解約済）or "210"(休止・中断中) or "220"(停止中) or "920"(キャンセル済)の場合はfalseを返却
		if (JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT))
				|| JKKModelConst.SVC_KEI_STAT_PAUSE_STP_CHU.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT))
				|| JKKModelConst.SVC_KEI_STAT_STP_CHU.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT))
				|| JKKModelConst.SVC_KEI_STAT_CNCL_ZM.equals(retMsgKK0081.getString(KK0081ETMsg.SVC_KEI_STAT)))
		{
			return false;
		}
		return true;
	}

	/**
	 * <p>
	 * Myホームページチェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return Myホームページの引継の場合、引継元が解約済でないかつ、引継元にURLが設定されている場合false。それ以外の場合true。
	 */
	private boolean isMyHamePageChk(CAANMsg inCBSMsg, String opeDate)
	{
		// リストが0件の場合は処理を行わない
		if (!isCheckList(inCBSMsg))
		{
			return true;
		}
		
		// 引継先サービス契約番号が未設定の場合は処理を行わない
		if (!isCheck(inCBSMsg, EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO))
		{
			return true;
		}

		// 入力明細を取得します
		CAANMsg[] list = inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST);
		
		// 入力明細の件数分繰り返します
		for (CAANMsg ekk0351c011Input : list)
		{
			// 引継対象オプションサービスコードが未設定または引継対象オプションサービスコードが"Myホームページ"以外
			// の場合は処理を行わない
			if (ekk0351c011Input.isNull(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD)
					|| !OP_SVC_CD_MHP.equals(ekk0351c011Input.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD)))
			{
				return true;
			}
		}

		// 引継先サービス契約番号に紐づく「オプションサービス契約」を取得する
		JKKejbKK0351DBABase kk0351Dba = new JKKejbKK0351DBABase();
		CAANMsg[] retMsgKK0351List = kk0351Dba.getKK0351bySvcKei(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_SK_SVC_KEI_NO), null, opeDate, "3");

		// 引継先のオプションサービス契約ステータスが解約済・キャンセル済の場合、対象外とする
		retMsgKK0351List = kk0351Dba.getKK0351OutDsLCl(retMsgKK0351List);
		
		for (CAANMsg retMsgKK0351 : retMsgKK0351List)
		{
			// Myホームページ以外のオプションは対象外とする
			if (!OP_SVC_CD_MHP.equals(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_CD)))
			{
				continue;
			}

			// オプションサービス契約<ISP>の一意照会を行う
			CAANMsg retMsgKK0361 = findByPrimaryKeyKK0361(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_KEI_NO), retMsgKK0351
					.getString(KK0351ETMsg.GENE_ADD_DTM));

			// レコードが取得できなかった場合は次の明細へ
			if (null == retMsgKK0361)
			{
				continue;
			}

			// URL(アカウント)が設定されている場合はfalseを返却
			if (!retMsgKK0361.isNull(KK0361ETMsg.URL_ACCOUNT))
			{
				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));
				continue;
			}

			// 集約局コードが設定されている場合
			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));
				continue;
			}
		}

		return arrayCent;
	}

	/**
	 * <p>
	 * 有効メール存在チェック共通処理。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opeDate 運用日付
	 * @return 引継ぎ元の引継ぎ対象以外のメールに、未来日指定のメールしか存在しなくなる場合false。それ以外の場合true。
	 */
	private boolean isValidMailChkCommon(CAANMsg inCBSMsg, String opeDate)
	{
		// 引継元サービス契約番号に紐づく「オプションサービス契約」を取得する
		JKKejbKK0351DBABase kk0351Dba = new JKKejbKK0351DBABase();
		CAANMsg[] retMsgKK0351List = kk0351Dba.getKK0351bySvcKei(inCBSMsg.getString(EKK0351C011CBSMsg.HKTGI_MT_SVC_KEI_NO), null, opeDate, "3");

		// レコード内データ件数算出用変数
		Long cntDb = 0L;

		// Eメールのオプションのみカウントする
		for (CAANMsg retMsgKK0351: retMsgKK0351List)
		{
			if (OP_SVC_CD_EML.equals(retMsgKK0351.getString(KK0351ETMsg.OP_SVC_CD)))
			{
				cntDb++;
			}
		}

		// リスト内データ件数算出用変数
		Long cntList = 0L;

		// リスト内のEメールのオプションをカウントする
		CAANMsg[] c011List = inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST);

		for (CAANMsg c011msg: c011List)
		{
			if (OP_SVC_CD_EML.equals(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD)))
			{
				cntList++;
			}
		}

		// リストのデータ件数 ≧ レコードのデータ件数の場合はfalseを返却する
		if (cntList >= cntDb)
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * サービス契約のカレントレコード検索を行います。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param opeDate 運用日付
	 * @return サービス契約のカレントレコードのメッセージ。
	 */
	private CAANMsg findByCurrentKK0081(String svcKeiNo, String opeDate)
	{
		// カレントレコード検索パラメータの設定
		CAANMsg inMsgKK0081 = new CAANMsg(KK0081ETMsg.class.getName());
		inMsgKK0081.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		inMsgKK0081.set(KK0081ETMsg.RSV_APLY_YMD, opeDate);

		// カレントレコードの検索
		return new JKKejbKK0081DBABase().findByCurrent(inMsgKK0081);
	}

	/**
	 * <p>
	 * オプションサービス契約のカレントレコード検索を行います。
	 * </p>
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param opeDate 運用日付
	 * @return オプションサービス契約のカレントレコードのメッセージ。
	 */
	private CAANMsg findByCurrentKK0351(String opSvcKeiNo, String opeDate)
	{
		// カレントレコード検索パラメータの設定
		CAANMsg inMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);

		// カレントレコードの検索
		return new JKKejbKK0351DBABase().findByCurrent(inMsgKK0351);
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>の一意検索を行います。
	 * </p>
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param geneAddDtm 世代年月登録年月日時分秒
	 * @return 指定されたプライマリキーに紐付くオプションサービス契約<ISP>のレコード。
	 */
	private CAANMsg findByPrimaryKeyKK0361(String opSvcKeiNo, String geneAddDtm)
	{
		// 一意検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0361ETMsg.class.getName());
		inETMsg.set(KK0361ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0361ETMsg.GENE_ADD_DTM, geneAddDtm);

		// オプションサービス契約<ISP>の一意検索を行う
		CAANMsg retMsgKK0361 = new JKKejbKK0361DBABase().findByPrimaryKey(inETMsg);

		// レコードが取得できなかった場合はnullを返却する
		if (null == retMsgKK0361)
		{
			return null;
		}

		// 取得したレコードが有効ではない場合はnullを返却する
		if (!MK_FLG_VALID.equals(retMsgKK0361.getString(KK0361ETMsg.MK_FLG)))
		{
			return null;
		}

		return retMsgKK0361;
	}

	/**
	 * <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_VALID.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_VALID.equals(retMsgZM0341.getString(ZM0341ETMsg.MK_FLG)))
		{
			return null;
		}

		return retMsgZM0341;
	}

	/**
	 * <p>
	 * サービス契約番号に紐付く、オプションサービス契約の件数を
	 * オプションサービスコードごとに集約して取得します。
	 * </p>
	 * @param  svcKeiNo サービス契約番号
	 * @param  opeDate 運用日付
	 * @return オプションサービスコードと、集約された件数を持つMAP
	 */
	private HashMap<String, Long> getKK0351IntentWithSvc(String svcKeiNo, String opeDate)
	{
		// コネクション
		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.OP_SVC_CD ");
			sql_Buff.append("     , COUNT(*) AS CNT ");
			sql_Buff.append(" FROM ");
			sql_Buff.append("    ( ");
			sql_Buff.append("     SELECT * FROM KK_T_OP_SVC_KEI KK0351_01 ");
			sql_Buff.append("     WHERE ");
			sql_Buff.append("         KK0351_01.SVC_KEI_NO = ? ");
			// 2017/04/25 ANK-3149-00-00 MOD START
			//sql_Buff.append("     AND ((KK0351_01.OP_SVC_CD IN ('B003', 'B004')) ");
			sql_Buff.append("     AND ((KK0351_01.OP_SVC_CD IN ('B003', 'B004', 'B131', 'B132')) ");
			// 2017/04/25 ANK-3149-00-00 MOD END
			sql_Buff.append("          OR (KK0351_01.OP_SVC_CD = 'B001'  ");
			sql_Buff.append("              AND EXISTS (SELECT ");
			sql_Buff.append("                              1 ");
			sql_Buff.append("                          FROM ");
			sql_Buff.append("                              KK_T_OPSVKEI_ISP KK0361 ");
			sql_Buff.append("                          WHERE ");
			sql_Buff.append("                              KK0361.OP_SVC_KEI_NO = KK0351_01.OP_SVC_KEI_NO ");
			sql_Buff.append("                              AND KK0361.GENE_ADD_DTM = KK0351_01.GENE_ADD_DTM ");
			sql_Buff.append("                              AND KK0361.MLAD IS NOT NULL ");
			sql_Buff.append("                              AND KK0361.MK_FLG = '0' )) ");
			sql_Buff.append("          OR (KK0351_01.OP_SVC_CD = 'B002' ");
			sql_Buff.append("              AND EXISTS (SELECT ");
			sql_Buff.append("                              1 ");
			sql_Buff.append("                          FROM ");
			sql_Buff.append("                              KK_T_OPSVKEI_ISP KK0361 ");
			sql_Buff.append("                          WHERE ");
			sql_Buff.append("                              KK0361.OP_SVC_KEI_NO = KK0351_01.OP_SVC_KEI_NO ");
			sql_Buff.append("                              AND KK0361.GENE_ADD_DTM = KK0351_01.GENE_ADD_DTM ");
			sql_Buff.append("                              AND KK0361.URL_ACCOUNT IS NOT NULL ");
			sql_Buff.append("                              AND KK0361.MK_FLG = '0' ))) ");
			sql_Buff.append("     AND KK0351_01.OP_SVC_KEI_STAT NOT IN ('910', '920') ");
			sql_Buff.append("     AND (KK0351_01.OP_SVC_KEI_NO, KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) = ");
			sql_Buff.append("         (SELECT KK0351_01_GENE.OP_SVC_KEI_NO, MAX(KK0351_01_GENE.RSV_APLY_YMD || KK0351_01_GENE.GENE_ADD_DTM) AS KK0351_01_MAX ");
			sql_Buff.append("          FROM   KK_T_OP_SVC_KEI KK0351_01_GENE ");
			sql_Buff.append("          WHERE  KK0351_01_GENE.OP_SVC_KEI_NO = KK0351_01.OP_SVC_KEI_NO ");
			sql_Buff.append("          AND    KK0351_01_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND    KK0351_01_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND    KK0351_01_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0351_01_GENE.OP_SVC_KEI_NO) ");
			sql_Buff.append("     UNION ");
			sql_Buff.append("     SELECT * FROM KK_T_OP_SVC_KEI KK0351_02 ");
			sql_Buff.append("     WHERE ");
			sql_Buff.append("         EXISTS (SELECT ");
			sql_Buff.append("                     1 ");
			sql_Buff.append("                 FROM ");
			sql_Buff.append("                     KK_T_SVC_KEI_UCWK KK0161 ");
			sql_Buff.append("                 WHERE ");
			sql_Buff.append("                     KK0161.SVC_KEI_NO = ? ");
			sql_Buff.append("                     AND KK0161.SVC_KEI_UCWK_NO = KK0351_02.SVC_KEI_UCWK_NO ");
			sql_Buff.append("                     AND (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) = ");
			sql_Buff.append("                         (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX ");
			sql_Buff.append("                         FROM   KK_T_SVC_KEI_UCWK KK0161_GENE ");
			sql_Buff.append("                         WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ");
			sql_Buff.append("                         AND    KK0161_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("                         AND    KK0161_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("                         AND    KK0161_GENE.MK_FLG = '0' ");
			sql_Buff.append("                         GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO)) ");
			// 2017/04/25 ANK-3149-00-00 MOD START
			//sql_Buff.append("     AND ((KK0351_02.OP_SVC_CD IN ('B003', 'B004')) ");
			sql_Buff.append("     AND ((KK0351_02.OP_SVC_CD IN ('B003', 'B004', 'B131', 'B132')) ");
			// 2017/04/25 ANK-3149-00-00 MOD END
			sql_Buff.append("          OR (KK0351_02.OP_SVC_CD = 'B001'  ");
			sql_Buff.append("              AND EXISTS (SELECT ");
			sql_Buff.append("                              1 ");
			sql_Buff.append("                          FROM ");
			sql_Buff.append("                              KK_T_OPSVKEI_ISP KK0361 ");
			sql_Buff.append("                          WHERE ");
			sql_Buff.append("                              KK0361.OP_SVC_KEI_NO = KK0351_02.OP_SVC_KEI_NO ");
			sql_Buff.append("                              AND KK0361.GENE_ADD_DTM = KK0351_02.GENE_ADD_DTM ");
			sql_Buff.append("                              AND KK0361.MLAD IS NOT NULL ");
			sql_Buff.append("                              AND KK0361.MK_FLG = '0' )) ");
			sql_Buff.append("          OR (KK0351_02.OP_SVC_CD = 'B002' ");
			sql_Buff.append("              AND EXISTS (SELECT ");
			sql_Buff.append("                              1 ");
			sql_Buff.append("                          FROM ");
			sql_Buff.append("                              KK_T_OPSVKEI_ISP KK0361 ");
			sql_Buff.append("                          WHERE ");
			sql_Buff.append("                              KK0361.OP_SVC_KEI_NO = KK0351_02.OP_SVC_KEI_NO ");
			sql_Buff.append("                              AND KK0361.GENE_ADD_DTM = KK0351_02.GENE_ADD_DTM ");
			sql_Buff.append("                              AND KK0361.URL_ACCOUNT IS NOT NULL ");
			sql_Buff.append("                              AND KK0361.MK_FLG = '0' ))) ");
			sql_Buff.append("     AND KK0351_02.OP_SVC_KEI_STAT NOT IN ('910', '920') ");
			sql_Buff.append("     AND (KK0351_02.OP_SVC_KEI_NO, KK0351_02.RSV_APLY_YMD || KK0351_02.GENE_ADD_DTM) = ");
			sql_Buff.append("         (SELECT KK0351_02_GENE.OP_SVC_KEI_NO, MAX(KK0351_02_GENE.RSV_APLY_YMD || KK0351_02_GENE.GENE_ADD_DTM) AS KK0351_02_MAX ");
			sql_Buff.append("          FROM   KK_T_OP_SVC_KEI KK0351_02_GENE ");
			sql_Buff.append("          WHERE  KK0351_02_GENE.OP_SVC_KEI_NO = KK0351_02.OP_SVC_KEI_NO ");
			sql_Buff.append("          AND    KK0351_02_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND    KK0351_02_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND    KK0351_02_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0351_02_GENE.OP_SVC_KEI_NO) ");
			sql_Buff.append("    ) KK0351 ");
			sql_Buff.append(" GROUP BY ");
			sql_Buff.append("     KK0351.OP_SVC_CD ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), sql_Buff);

			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, opeDate);
			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 3, svcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 4, opeDate);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 5, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 返却用MAP
			HashMap<String, Long> retMap = new HashMap<String, Long>();

			// 結果の設定
			while (rsltQuery.next())
			{
				retMap.put(rsltQuery.getString(KK0351ETMsg.OP_SVC_CD), rsltQuery.getLong("CNT"));
			}

			return retMap;
		}
		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  svcKeiNo サービス契約番号
	 * @param  opeDate 運用日付
	 * @return サービス契約番号に紐付くファミリーパックの割引サービス契約の件数
	 */
	private long findByCondKK0451Family(String svcKeiNo, String opeDate)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK0451ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();

			sql_Buff.append(" SELECT  ")
					.append("    COUNT(*) AS CNT ")
					.append(" FROM  ")
					.append("     KK_T_WRISVC_TG_KEI KK0481  ")
					.append("     INNER JOIN KK_T_WRIB_SVC_KEI KK0451  ")
					.append("     ON KK0451.WRIB_SVC_KEI_NO = KK0481.WRIB_SVC_KEI_NO  ")
					.append(" WHERE  ")
					.append("     KK0481.SVC_KEI_NO = ?  ")
					.append("     AND KK0451.WRIB_SVC_CD = 'W00000006'  ")
					.append("     AND KK0451.WRIB_SVC_KEI_STAT IN ('010', '100')  ")
					.append("     AND (KK0481.WRIB_SVC_KEI_NO, KK0481.WRIB_SVC_TRGT_KEI_NO, KK0481.GENE_ADD_DTM) =  ")
					.append("              (SELECT KK0481_GENE.WRIB_SVC_KEI_NO, KK0481_GENE.WRIB_SVC_TRGT_KEI_NO, MAX(KK0481_GENE.GENE_ADD_DTM) AS KK0481_MAX  ")
					.append("               FROM   KK_T_WRISVC_TG_KEI KK0481_GENE  ")
					.append("               WHERE  KK0481_GENE.WRIB_SVC_KEI_NO = KK0481.WRIB_SVC_KEI_NO  ")
					.append("               AND    KK0481_GENE.WRIB_SVC_TRGT_KEI_NO = KK0481.WRIB_SVC_TRGT_KEI_NO  ")
					.append("               AND    KK0481_GENE.WRISVC_TG_KEI_TSTAYMD <= ?  ")
					.append("               AND    KK0481_GENE.WRISVC_TG_KEI_TENDYMD >= ?  ")
					.append("               AND    KK0481_GENE.MK_FLG= '0'  ")
					.append("               GROUP BY KK0481_GENE.WRIB_SVC_KEI_NO, KK0481_GENE.WRIB_SVC_TRGT_KEI_NO)  ")
					.append("     AND (KK0451.WRIB_SVC_KEI_NO, KK0451.RSV_APLY_YMD || KK0451.GENE_ADD_DTM) =  ")
					.append("              (SELECT KK0451_GENE.WRIB_SVC_KEI_NO, MAX(KK0451_GENE.RSV_APLY_YMD || KK0451_GENE.GENE_ADD_DTM) AS KK0451_MAX  ")
					.append("               FROM   KK_T_WRIB_SVC_KEI KK0451_GENE  ")
					.append("               WHERE  KK0451_GENE.WRIB_SVC_KEI_NO = KK0451.WRIB_SVC_KEI_NO  ")
					.append("               AND    KK0451_GENE.RSV_APLY_YMD <= ?  ")
					.append("               AND    KK0451_GENE.RSV_APLY_CD = '2'  ")
					.append("               AND    KK0451_GENE.MK_FLG= '0'  ")
					.append("               GROUP BY KK0451_GENE.WRIB_SVC_KEI_NO)  ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), sql_Buff);

			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, opeDate);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, opeDate);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 4, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// データが取得できた場合は件数を返却
			if (rsltQuery.next())
			{
				return rsltQuery.getLong("CNT");
			}

			// 取得できなかった場合は0件を返却
			return 0L;
		}
		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 pcrsCd 料金コースコード
	 * @param sbopSvcCd サブオプションサービスコード
	 * @param opeDate 運用日付
	 * @return サービス提供物最大値
	 */
	private long findByCondKK1881(String pcrsCd, String sbopSvcCd, String opeDate)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		long lDataCnt = 0L;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK1881ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT ")
					.append("    KK1881.SVCTK_BUT_MAX_VALUE ")
					.append("FROM ")
					.append("    KK_M_PCRS_SBOP_SVC KK1881 ")
					.append("WHERE ")
					.append("    KK1881.PCRS_CD = ? ")
					.append("    AND KK1881.SBOP_SVC_CD = ? ")
					.append("    AND KK1881.PCRS_SBOP_SVC_TSTAYMD <= ? ")
					.append("    AND KK1881.PCRS_SBOP_SVC_TENDYMD >= ? ")
					.append("    AND KK1881.MK_FLG= '0' ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), sql_Buff);

			// パラメータの設定(料金コースコードを指定)
			CAANJDBCUtil.setParam(pstmt, 1, pcrsCd);
			// パラメータの設定(サブオプションサービスコードを指定)
			CAANJDBCUtil.setParam(pstmt, 2, sbopSvcCd);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, opeDate);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 4, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 件数を返却する
			if (rsltQuery.next())
			{
				lDataCnt = rsltQuery.getLong(KK1881ETMsg.SVCTK_BUT_MAX_VALUE);
			}

		}
		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 mtPcrsCd 引継元料金コースコード
	 * @param skPcrsCd 引継先料金コースコード
	 * @param opeDate 運用日付
	 * @return 引継元、引継先料金コースコードが一致するレコード。
	 */
	private ArrayList<String> findByCondKK2131(String mtPcrsCd, String skPcrsCd, String opeDate)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK2131ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT ")
					.append("    KK2131.HKTGI_TG_OP_SVC_CD ")
					.append("FROM ")
					.append("    KK_M_OP_HKTGI_PSBJKN KK2131 ")
					.append("WHERE ")
					.append("    KK2131.HKTGI_MOTO_PCRS_CD = ? ")
					.append("    AND KK2131.HKTGI_SAKI_PCRS_CD = ? ")
					.append("    AND KK2131.OP_HKTGI_PSBJKN_TSTAYMD <= ? ")
					.append("    AND KK2131.OP_HKTGI_PSBJKN_TENDYMD >= ? ")
					.append("    AND KK2131.MK_FLG = '0' ");


			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), sql_Buff);

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, 1, mtPcrsCd);
			CAANJDBCUtil.setParam(pstmt, 2, skPcrsCd);
			CAANJDBCUtil.setParam(pstmt, 3, opeDate);
			CAANJDBCUtil.setParam(pstmt, 4, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 返却用メッセージ
			ArrayList<String> retArray = new ArrayList<String>();

			// データをリストに詰めて返却
			while (rsltQuery.next())
			{
				retArray.add(rsltQuery.getString(KK2131ETMsg.HKTGI_TG_OP_SVC_CD));
			}

			return retArray;
		}
		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 inCBSMsg 処理対象のメッセージキャリア
	 * @param opSvcCd オプションサービスコード
	 * @return リスト内に対象のオプションサービスが存在する場合はtrue。存在しない場合はfalse。
	 */
	private boolean isOpSvcInList(CAANMsg inCBSMsg, String opSvcCd)
	{
		// リストを取得
		CAANMsg[] c011List = inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST);

		for (CAANMsg c011msg: c011List)
		{
			// 指定されたオプションサービスコードが存在する場合はtrueを返却
			if (opSvcCd.equals(c011msg.getString(EKK0351C011CBSMsg1List.HKTGI_TRG_OP_SVC_CD)))
			{
				return true;
			}
		}

		// 存在しなかった場合はfalseを返却
		return false;
	}

	/**
	 * <p>
	 * 指定された項目の設定値が一致しているかのチェックを行う。
	 * </p>
	 * @param arg0 比較パラメータ１
	 * @param arg1 比較パラメータ２
	 * @return 比較結果（null同士は一致するものとみなす）
	 */
	private boolean isParamCheck(String arg0, String arg1)
	{
		if (arg0 == null)
		{
			if (arg1 != null)
			{
				return false;
			}
		}

		else if (arg0 != null)
		{
			if (arg1 == null)
			{
				return false;
			}
			else if (!arg0.equals(arg1))
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * <p>
	 * 関連チェック実施判定。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param contntsList チェック実施判定項目
	 * @return チェック実施判定項目が全て設定されている場合true。それ以外の場合false。
	 */
	private boolean isCheck(CAANMsg inCBSMsg, String... contntsList)
	{
		// チェック実施判定項目をすべてチェック
		for (String contents: contntsList)
		{
			// チェック実施判定項目が設定されていない場合はfalseを返却
			if (inCBSMsg.isNull(contents))
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * <p>
	 * 関連チェック実施判定（リスト用）。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @return リストが1件以上の場合はtrue。それ以外の場合false。
	 */
	private boolean isCheckList(CAANMsg inCBSMsg)
	{
		// リストが0件の場合はfalseを返却する
		CAANMsg[] list = inCBSMsg.getCAANMsgList(EKK0351C011CBSMsg.EKK0351C011CBSMSG1LIST);
		if (list.length < 1)
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * エラー返却項目にエラーフラグを設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param status エラー時のステータス
	 * @param errInfo[] エラー情報が設定された配列 [0]:エラーフラグ [1]:エラー返却項目
	 */
	private void setErrInfo(CAANMsg inCBSMsg, int status, String[] errInfo)
	{
		inCBSMsg.set(JCMConstants.STATUS_INT_KEY, status);
		inCBSMsg.set(errInfo[1], errInfo[0]);
		return;
	}

}
