/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKK0081C260KRCK
*	ソースファイル名：JKK0081C260KRCK.java
*	作成者			：EK103142
*	日付			：2011年10月09日
*＜機能概要＞
*	関連チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ4.00.00	2013/02/19	FJ)坂本		TAI-2012-0000101
*	ｖ4.00.01	2013/04/01	FJ)沖田		IKK-2013-0000708
*   ｖ5.00.00   2013/10/09  FJ)寺園     OM-2013-0003064
*   ｖ5.00.01   2013/10/28  FJ)寺本     OM-2013-0003472
*   ｖ5.00.02   2013/10/29  FJ)沖田     OM-2013-0003804
*  ｖ33.00.00   2017/08/28  FJ)三原     ANK-3241-00-00_eo電気サービスの解約連携エラーに関する対応
********************************************************************************/

package eo.ejb.common.entity;

import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.common.JCCWebAddTrnId;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK0081C260CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;

/**
 * <p>
 * サービス契約解約確定チェッククラスです。
 * ＜メソッド一覧＞
 * execKRCK
 * execEKK0081C260_KR1
 * execEKK0081C260_KR3
 * execEKK0081C260_KR4
 * execEKK0081C260_KR5
 * execEKK0081C260_KR6
 * execEKK0081C260_KR7
 * </p>
 * @author 富士通
 */

public class JEKK0081C260KRCK
{
	/** 異動予約詳細コード：サービス解約 */
	private static final String IDO_RSV_CD_SVC_KAIYAKU = "007";
	
	/** 異動予約状態コード：予約手続中 */
	private static final String IDO_RSV_STAT_CD_RSV_TETUDUKI = "03"; 

	/** 電話単独契約不可チェック対象外フラグ（チェックしない） */
	private static final String TEL_SNGLKEI_FAIL_CHK_FLG = "1";

	/** 異動区分：00064(強制解約) */
	private static final String IDO_DIV_KSI_DSL = "00064";

	// ANK-3241-00-00 ADD START
	/** サービスID：KKSV0807(eo電気サービス解約受付) */
	private static final String SVC_ID_KKSV0807 = "KKSV0807";
	// ANK-3241-00-00 ADD END

	/**
	 * コンストラクタ
	 */
	public JEKK0081C260KRCK()
	{
	}

	/**
	 * サービス契約解約確定チェックを行います。
	 * 
	 * @param inCBSMsg エンティティ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */

	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// ANK-3241-00-00 ADD START
		// 共通メッセージからサービス呼び出し元の区分を取得する
		HashMap<String, Object> commonMsg = JCCWebAddTrnId.get(JCMConstants.ADD_TRN_ID_MESSAGE_COMMON_MAP);

		// 呼び出し元サービスID
		String serviceId = (String)commonMsg.get(JCMConstants.USECASE_ID_KEY);
		// ANK-3241-00-00 ADD END
		
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JKK0081C260KRCK.execKRCK");
		
		// inCBSMsgのチェック
		if(inCBSMsg == null)
		{
			throw new CAANRuntimeException("inCBSMsgがnullです。");
		}
		// ステータス
		int rtn = 0;
		
		boolean execCheckFlg = isCheckExec(inCBSMsg, inContext);
		boolean TelTdkFkChkFlg = isCheckExecTelTdkFk(inCBSMsg, inContext);
		
		rtn = execEKK0081C260_KR1(inCBSMsg, inContext, "EA");
		if(rtn <= StatusCodes.WARNING)
		{
			// ANK-3241-00-00 MOD START
			//// 異動区分：強制解約の場合チェックしない
			//if (execCheckFlg) {
			// 異動区分：強制解約でない、かつサービスIDが"KKSV0807"でない場合チェックする
			if (execCheckFlg && !SVC_ID_KKSV0807.equals(serviceId))
			{
			// ANK-3241-00-00 MOD END
				rtn = execEKK0081C260_KR4(inCBSMsg, inContext, "EA");
			}
		}
		if(rtn <= StatusCodes.WARNING)
		{
			// 異動区分：強制解約の場合チェックしない
			if (execCheckFlg) {
				rtn = execEKK0081C260_KR5(inCBSMsg, inContext, "EB");
			}
		}	
		if(rtn <= StatusCodes.WARNING)
		{
			// 異動区分：強制解約の場合チェックしない
			if (execCheckFlg) {
				rtn = execEKK0081C260_KR6(inCBSMsg, inContext, "EC");
			}
		}
		if (rtn <= StatusCodes.WARNING)
		{
			if (TelTdkFkChkFlg)
			{
				rtn = execEKK0081C260_KR7(inCBSMsg, inContext, "EC");
			}
		}
		if(rtn <= StatusCodes.WARNING)
		{
			rtn = execEKK0081C260_KR3(inCBSMsg, inContext, "EB");
		}
		
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JKK0081C260KRCK.execKRCK");
	}
		
	/**
	 * EKK0081C260_制約ＮＯ1（関連）チェック
	 * 未存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C260CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C260_KR1(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		JKKejbKK0081KRCK kk0081krck = new JKKejbKK0081KRCK();
		
		// サービス契約番号
		String svcKeiNo = inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO); // サービス契約番号
		
		// チェック条件
		// サービス契約_サービス契約存在チェック

		// 判定条件
		if (!kk0081krck.isExistsCurrent(inCBSMsg, svcKeiNo))
		{
			// レコードが存在しない場合エラー
			inCBSMsg.set(EKK0081C260CBSMsg.SVC_KEI_NO_ERR, errFlag);

			if("W".equals(errFlag.substring(0, 1)))
			{
				result = StatusCodes.WARNING;
			}
			else 
			{
				result = StatusCodes.RELATION_ERR;
			}
		}
		
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		
		// レコードが存在する場合正常終了
		return result;
	}
	
	/**
	 * EKK0081C260_制約ＮＯ3（関連）チェック
	 * 未存在チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C260CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C260_KR3(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// 判定フラグ
		boolean judgeFlg = false;
		
		if (!inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_KEI_NO) && "1".equals(inCBSMsg.getString(EKK0081C260CBSMsg.FUNC_CODE)))
		{
			try
			{
				// 異動予約メッセージインスタンスを生成
				CAANMsg idoMsg = new CAANMsg(KK1681ETMsg.class.getName());
	
				// サービス契約番号に紐付く異動予約番号を取得するためにメッセージを生成
				idoMsg.set(KK1681ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO));
				idoMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDO_RSV_CD_SVC_KAIYAKU);
				idoMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDO_RSV_STAT_CD_RSV_TETUDUKI);
				idoMsg.set(KK1681ETMsg.MK_FLG, "0");
	
				// KK1681LEインスタンスの生成
				KK1681LE idoLe = new KK1681LE();
	
				// CAANMsg配列を生成
				CAANMsg[] resIdoMsg = new CAANMsg[]{};
	
				// ロジカルエンティティを生成し、異動予約を検索
				resIdoMsg = idoLe.findByCondition(idoMsg);
				
				if(resIdoMsg.length > 0)
				{
					
					//レコードが存在する場合
					judgeFlg = true;
				}
				
				if (!judgeFlg)
				{
					// レコードが存在しない場合
					inCBSMsg.set(EKK0081C260CBSMsg.SVC_KEI_NO_ERR, errFlag);
						
					if("W".equals(errFlag.substring(0, 1)))
					{
						result = StatusCodes.WARNING;
					}
					else 
					{
						result = StatusCodes.RELATION_ERR;
					}
				}
			}
			catch(CAANException ce)
			{
				throw new CAANRuntimeException(ce);
			}
		}
		
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}

		return result;
	}

	/**
	 * EKK0081C260_制約ＮＯ４（関連）チェック
	 * サービス解約起算年月日妥当性チェック（料金月初日）を行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C260CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C260_KR4(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		// サービス契約_サービス解約起算年月日妥当性チェック（料金月初日）
		if (inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_KEI_NO))
		{
			return result;
		}

		if (inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_ENDYMD))
		{
			return result;
		}

		if (inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD))
		{
			return result;
		}

		// 運用日 ＜ サービス終了年月日の場合はチェックを行わない
		if (JPCUtilCommon.isFutureDate(inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD), JKKModelCommon.getOpeDate(inCBSMsg), "0"))
		{
			return result;
		}

		// チェック用ETMsgの生成
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO));
		inETMsg.set(KK0081ETMsg.SVC_ENDYMD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD));
		inETMsg.set(KK0081ETMsg.SVC_DSL_KISAN_YMD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD));
		
		// 判定条件
		if (!new JKKejbKK0081KRCK().isSvcDslKisYmdValMonFst(inETMsg, inContext))
		{
			// サービス解約起算年月日が範囲外の場合エラー
			inCBSMsg.set(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD_ERR, errFlag);

			if("W".equals(errFlag.substring(0, 1)))
			{
				result = StatusCodes.WARNING;
			}
			else 
			{
				result = StatusCodes.RELATION_ERR;
			}
		}
		
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		
		return result;
	}
	
	/**
	 * EKK0081C260_制約ＮＯ５（関連）チェック
	 * サービス解約起算年月日妥当性チェック（サービス開始年月日）を行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C260CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C260_KR5(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		// サービス契約_サービス解約起算年月日妥当性チェック（サービス開始年月日）
		if (inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_KEI_NO))
		{
			return result;
		}

		if (inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_ENDYMD))
		{
			return result;
		}

		if (inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD))
		{
			return result;
		}

		// 運用日 ＜ サービス終了年月日の場合はチェックを行わない
		if (JPCUtilCommon.isFutureDate(inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD), JKKModelCommon.getOpeDate(inCBSMsg), "0"))
		{
			return result;
		}

		// チェック用ETMsgの生成
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO));
		inETMsg.set(KK0081ETMsg.SVC_ENDYMD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD));
		inETMsg.set(KK0081ETMsg.SVC_DSL_KISAN_YMD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD));
		
		// 判定条件
		if (!new JKKejbKK0081KRCK().isSvcDslKisYmdValSvcSta(inETMsg, inContext))
		{
			// サービス解約起算年月日が範囲外の場合エラー
			inCBSMsg.set(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD_ERR, errFlag);

			if("W".equals(errFlag.substring(0, 1)))
			{
				result = StatusCodes.WARNING;
			}
			else 
			{
				result = StatusCodes.RELATION_ERR;
			}
		}
		
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		
		return result;
	}
	
	/**
	 * EKK0081C260_制約ＮＯ６（関連）チェック
	 * サービス解約起算年月日妥当性チェック（回復年月日）を行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C260CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C260_KR6(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		// サービス契約_サービス解約起算年月日妥当性チェック（回復年月日）
		if (inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_KEI_NO))
		{
			return result;
		}

		if (inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_ENDYMD))
		{
			return result;
		}

		if (inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD))
		{
			return result;
		}

		// 運用日 ＜ サービス終了年月日の場合はチェックを行わない
		if (JPCUtilCommon.isFutureDate(inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD), JKKModelCommon.getOpeDate(inCBSMsg), "0"))
		{
			return result;
		}

		// チェック用ETMsgの生成
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO));
		inETMsg.set(KK0081ETMsg.SVC_ENDYMD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD));
		inETMsg.set(KK0081ETMsg.SVC_DSL_KISAN_YMD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD));
		
		// 判定条件
		if (!new JKKejbKK0081KRCK().isSvcDslKisYmdValKaihk(inETMsg, inContext))
		{
			// サービス解約起算年月日が範囲外の場合エラー
			inCBSMsg.set(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD_ERR, errFlag);

			if("W".equals(errFlag.substring(0, 1)))
			{
				result = StatusCodes.WARNING;
			}
			else 
			{
				result = StatusCodes.RELATION_ERR;
			}
		}
		
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		
		return result;
	}
	
	/**
	 * EKK0081C260_制約ＮＯ７（関連）チェック
	 * 電話単独契約不可チェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C260CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C260_KR7(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
		
		// チェック条件
		// 電話単独契約不可チェック対象外フラグが"1"でない場合
		if (TEL_SNGLKEI_FAIL_CHK_FLG.equals(inCBSMsg.getString(EKK0081C260CBSMsg.TEL_SNGLKEI_FAIL_CHK_FLG)))
		{
			return result;
		}
		
		// チェック条件
		// サービス契約_電話単独契約不可チェック
		if (inCBSMsg.isNull(EKK0081C260CBSMsg.SVC_KEI_NO))
		{
			return result;
		}

		// チェック用ETMsgの生成
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO));
		
		// 判定条件
		if (!new JKKejbKK0081KRCK().isTelSnglFailChkForNetDsl(inETMsg, inContext, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD)))
		{
			// 解約後に電話契約のみになる場合エラー
			inCBSMsg.set(EKK0081C260CBSMsg.SVC_KEI_NO_ERR, errFlag);

			if("W".equals(errFlag.substring(0, 1)))
			{
				result = StatusCodes.WARNING;
			}
			else 
			{
				result = StatusCodes.RELATION_ERR;
			}
		}
		
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		
		return result;
	}
	

	/**
	 * サービス契約番号に紐付く異動予約レコードを取得し、サービス開始起算年月日のチェック対象かどうかを判定する。
	 * 異動予約．異動予約詳細コード："007"(サービス解約)かつ異動予約．異動区分が"00064"(強制解約)のレコードが存在する場合、
	 * 関連制約「サービス解約起算年月日妥当性チェック」を行わない。
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C260CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @return checkExecFlg 妥当性チェック実行フラグ true：妥当性チェックを行う、false：妥当性チェックを行わない
	 */
	private boolean isCheckExec(CAANMsg inCBSMsg, AgentDispatchContext inContext) {

		// サービス契約番号に紐付く異動予約検索を行う
		List<CAANMsg> retList = new JKKejbIdoRsvAccess().getIdoRsvSvcKeiNo(inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO), JKKModelCommon.getOpeDate(inCBSMsg));

		boolean checkExecFlg = true;
		// 
		for (int i = 0; i < retList.size(); i++)
		{
			// 異動予約詳細コードが"007"(サービス解約)かつ異動区分が"00064"(強制解約)の場合、妥当性チェックを行わない
			if (IDO_RSV_CD_SVC_KAIYAKU.equals(retList.get(i).getString(KK1681ETMsg.IDO_RSV_DTL_CD)) && 
					IDO_DIV_KSI_DSL.equals(retList.get(i).getString(KK1681ETMsg.IDO_DIV))) {
				checkExecFlg = false;
				break;
			}
		}
		return checkExecFlg;
	}
	
	/**
	 * サービス契約番号に紐付く異動予約レコードを取得し、電話単独不可チェック対象かどうかを判定する。
	 * 異動予約．異動区分が"撤去(解約)"、"工事情報訂正"、"登録内容修正"のレコードが存在する場合、関連制約「電話単独契約不可チェック」を行わない。
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C260CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @return checkExecFlg 妥当性チェック実行フラグ true：妥当性チェックを行う、false：妥当性チェックを行わない
	 */
	private boolean isCheckExecTelTdkFk(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 呼出先サービスが"バッチ"かつJOBIDが"強制解約"の場合
		if (JKKModelCommon.isBatOpeDateJobDsl())
		{
			// チェックしない
			return false;
		}

		try
		{
			// 異動予約メッセージインスタンスを生成
			CAANMsg idoMsg = new CAANMsg(KK1681ETMsg.class.getName());

			// サービス契約番号に紐付く異動予約番号を取得するためにメッセージを生成
			idoMsg.set(KK1681ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO));
			idoMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, JKKModelConst.IDO_RSV_DTL_CD_SVC_DSL);
			idoMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, JKKModelConst.IDO_RSV_STAT_CD_RSV_TTDK_CHU);
			idoMsg.set(KK1681ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

			// KK1681LEインスタンスの生成
			KK1681LE idoLe = new KK1681LE();

			// ロジカルエンティティを生成し、異動予約を検索
			CAANMsg[] resIdoMsg = idoLe.findByCondition(idoMsg);

			/* ----------------------------------------------------------------------------------------------------
			 * 複数の「異動予約」(異動予約詳細コード＝"解約")が存在する場合、
			 * 異動区分、申込明細番号などを入力項目(必須)として、更新対象の「異動予約」を特定する必要があるが、
			 * 現時点では、入力値が存在しないため、異動予約番号が最大の「異動予約」を更新対象とする。
			 * ---------------------------------------------------------------------------------------------------- */
			// 更新対象「異動予約」
			CAANMsg updTgKK1681Msg = null;
			// 更新対象「異動予約」の異動予約番号
			String updTgIdoRsvNo = null;

			for (CAANMsg kk1681Msg : resIdoMsg)
			{
				// 入力.異動区分が指定されている場合、異動区分が異なる「異動予約」は更新対象外とする。
				if (inCBSMsg.getString(EKK0081C260CBSMsg.IDO_DIV) != null
						&& !inCBSMsg.getString(EKK0081C260CBSMsg.IDO_DIV).equals(kk1681Msg.getString(KK1681ETMsg.IDO_DIV)))
				{
					continue;
				}
				String idoRsvNo = kk1681Msg.getString(KK1681ETMsg.IDO_RSV_NO);
				if (updTgIdoRsvNo == null || updTgIdoRsvNo.compareTo(idoRsvNo) < 0)
				{
					updTgIdoRsvNo = idoRsvNo;
					updTgKK1681Msg = kk1681Msg;
				}
			}
			if (updTgKK1681Msg == null)
			{
				throw new CAANRuntimeException("解約確定対象のサービス契約に対する異動予約が存在しません。サービス契約番号:" + inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO));
			}

			// 更新対象の予約レコードの異動区分が"撤去(解約)"、"工事情報訂正"、"登録内容修正"の場合
			if (JKKModelConst.IDO_DIV_TEKKYO_DSL.equals(updTgKK1681Msg.getString(KK1681ETMsg.IDO_DIV))
					|| JKKModelConst.IDO_DIV_ADD_NAIYO_SHUSEI.equals(updTgKK1681Msg.getString(KK1681ETMsg.IDO_DIV))
					|| JKKModelConst.IDO_DIV_KJJH_TEISE.equals(updTgKK1681Msg.getString(KK1681ETMsg.IDO_DIV)))
			{
				// チェックしない
				return false;
			}
			return true;
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
	}
}