/*******************************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbKK0351SecProc
 *	ソースファイル名：JKKejbKK0351SecProc.java
 *	作成者			：EKek0017
 *	日付			：2011年03月14日
 *＜機能概要＞
 *	オプションサービス契約に対する副次処理を行う部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *	v4.00.00	2013/04/17	FJ)沖田		IT1-2012-0000903
 *	v5.00.00	2013/07/09	FJ)寺園		LT-2013-0000321
 *	v8.00.00	2014/06/02	FJ)小島		OM-2014-0001861
 *	v33.00.00	2017/09/09	FJ)星野		OM-2017-0000920
 ********************************************************************************/

package eo.ejb.common.db;

import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANFinderException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0351LE;
import eo.ejb.cbm.entity.KK0361ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0021C060CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081C250CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.entity.JKKejbIdoRsvAccess;

/**
* <p>
* オプションサービス契約に対する副次処理を行う部品です。
* </p>
* @author 富士通
*/
public class JKKejbKK0351SecProc extends JKKejbKK0351DBABase
{

	/** オプションサービス契約ステータス**/
	private static final String OP_STAT_TEIKETSU = "030";

	/** オプションサービス契約コード(Ｅメール) **/
	private static final String OP_KEI_CD_EMAIL = "B001";

	/**
	 * 状態遷移定義の配列 (受付済)010 ,(照査済)020,(締結済)030 ,(サービス提供中)100 ,(休止・中断中)210 ,(停止中)220
	 */
	private static final String[] STATE_CONTENTS = {"010", "020", "030", "100", "210", "220"};

	/** 無効フラグ(有効) **/
	private static final String MK_FLG_YUKO = "0";

	/** 予約適用コード(予約確定) **/
	private static final String RSV_APLY_CD_KAKUTEI = "2";

	/** 予約適用コード(予約取消) */
	private static final String RSV_CANCEL = "3";

	/**
	 * <p>
	 * オプションサービス契約の照査締結を行います。
	 * </p>
	 * @param cbsMsg CBSメッセージ
	 * @param keyOp カレントレコードを取得するためのメッセージ
	 * @param shosaYmd 照査年月日
	 * @param idoDiv 異動区分
	 */
	protected void opSvKeiShosaCnc(CAANMsg cbsMsg, CAANMsg keyOp, String shosaYmd, String idoDiv)
	{
		CAANMsg crtKK0351 = findByCurrent(keyOp);

		// オプションサービス契約照査締結処理を行う。
		crtKK0351.set(KK0351ETMsg.GENE_ADD_DTM, JKKModelCommon.getSysDateTimeStamp());
		crtKK0351.set(KK0351ETMsg.OP_SVC_KEI_STAT, OP_STAT_TEIKETSU);
		crtKK0351.set(KK0351ETMsg.SHOSA_YMD, shosaYmd);
		crtKK0351.setNull(KK0351ETMsg.SHOSA_CL_YMD);
		crtKK0351.set(KK0351ETMsg.KEI_CNC_YMD, shosaYmd);
		crtKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(cbsMsg));
		crtKK0351.set(KK0351ETMsg.RSV_APLY_CD, RSV_APLY_CD_KAKUTEI);
		crtKK0351.set(KK0351ETMsg.IDO_DIV, idoDiv);
		crtKK0351.set(KK0351ETMsg.ADD_DTM, cbsMsg.getString(EKK0021C060CBSMsg.OPERATEDATETIME));
		crtKK0351.set(KK0351ETMsg.ADD_OPEACNT, cbsMsg.getString(EKK0021C060CBSMsg.ADD_OPEACNT));
		crtKK0351.set(KK0351ETMsg.UPD_DTM, cbsMsg.getString(EKK0021C060CBSMsg.OPERATEDATETIME));
		crtKK0351.set(KK0351ETMsg.UPD_OPEACNT, cbsMsg.getString(EKK0021C060CBSMsg.UPD_OPEACNT));
		crtKK0351.setNull(KK0351ETMsg.DEL_DTM);
		crtKK0351.setNull(KK0351ETMsg.DEL_OPEACNT);
		crtKK0351.set(KK0351ETMsg.MK_FLG, MK_FLG_YUKO);

		try
		{
			create(crtKK0351);
		}
		catch (CAANCreateException e1)
		{
			throw new CAANRuntimeException(e1);
		}

	}

	/**
	 * <p>
	 * オプションサービス契約のお客様変更を行います。
	 * </p>
	 * @param inCbsMsg CBSメッセージ
	 * @param svcKeiNo サービス契約契約番号
	 * @param kk0161MsgList サービス契約内訳
	 * @param sysid SYSID
	 * @param mskmDtlNo 申込明細番号
	 * @param rsvAplyYmd 予約適用年月日
	 * @param idoDiv 異動区分
	 */
	public void opSvKeiCustchg(CAANMsg inCbsMsg, String svcKeiNo, CAANMsg[] kk0161MsgList, String sysid, String mskmDtlNo, String rsvAplyYmd, String idoDiv)
	{

		// オプションサービス契約の一覧照会を行う
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsg.set(KK0351ETMsg.SVC_KEI_NO, svcKeiNo);

		KK0351LE kk0351 = new KK0351LE();
		CAANMsg[] otETMsg = null;

		try
		{
			otETMsg = kk0351.findByCondition(inETMsg);
		}
		catch (CAANException e1)
		{
			throw new CAANRuntimeException(e1);
		}
		
		// 処理済みオプションサービス契約保持用
		HashMap<String, String> hash = new HashMap<String, String>();

		// サービス契約に紐付く契約が存在しない場合は次へ
		int listCnt = otETMsg.length;
		if (listCnt > 0)
		{
			
			for (int j = 0; j < listCnt; j++)
			{
				if (hash.containsKey(otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO)))
				{
					continue;
				}

				// 読み込んだオプションサービス契約番号を控える
				hash.put(otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO), otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO));

				// オプションサービス契約の登録処理
				opSvKeiCustchgInsert(inCbsMsg, otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO), sysid, mskmDtlNo, rsvAplyYmd, idoDiv);
				
				// OM-2017-0000920対応 20170920 星野 ADD START
				// 未来日レコードも合わせて更新する
				opSvKeiCustChgUpdateFuture(inCbsMsg, otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO), sysid, rsvAplyYmd);
				// OM-2017-0000920対応 20170920 星野 ADD END
			}

		}
		
		// サービス契約内訳に紐づくオプションサービス契約を更新
		for (CAANMsg kk0161Msg : kk0161MsgList)
		{
			String svcKeiUcwkNo = kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);

			// オプションサービス契約の一覧照会を行う
			inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
			inETMsg.set(KK0351ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);

			otETMsg = null;

			try
			{
				otETMsg = kk0351.findByCondition(inETMsg);
			}
			catch (CAANException e1)
			{
				throw new CAANRuntimeException(e1);
			}
			
			// サービス契約に紐付く契約が存在しない場合は次へ
			listCnt = otETMsg.length;
			if (listCnt > 0)
			{
				
				for (int j = 0; j < listCnt; j++)
				{
					if (hash.containsKey(otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO)))
					{
						continue;
					}

					// 読み込んだオプションサービス契約番号を控える
					hash.put(otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO), otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO));

					// オプションサービス契約の登録処理
					opSvKeiCustchgInsert(inCbsMsg, otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO), sysid, mskmDtlNo, rsvAplyYmd, idoDiv);
				}

			}
		}
	}
	
	/**
	 * 
	 * @param inCbsMsg CBSメッセージ
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sysid SYSID
	 * @param mskmDtlNo 申込明細番号
	 * @param rsvAplyYmd 予約適用年月日
	 * @param idoDiv 異動区分
	 */
	private void opSvKeiCustchgInsert(CAANMsg inCbsMsg, String opSvcKeiNo, String sysid, String mskmDtlNo, String rsvAplyYmd, String idoDiv)
	{
		try
		{
			// 更新前のSYSID
			String oldSysid0351 = null;
			// 遷移状態
			String strOpSvcKeiStat = null;
			// オプションサービスコード
			String strOpSvcCd = null;
			
			// オプションサービス契約のETメッセージに以下の値を設定し、オプションサービス契約のカレントレコードの照会を行う。
			CAANMsg msgKkCrt = new CAANMsg(KK0351ETMsg.class.getName());

			msgKkCrt.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
			msgKkCrt.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCbsMsg));

			// 副次の判定を行う
			JKKejbKK0351DBABase kk0351DB = new JKKejbKK0351DBABase();
			CAANMsg retKK0351 = kk0351DB.findByCurrent(msgKkCrt);

			if (retKK0351 == null)
			{
				return;
			}

			// 更新前のSYSID取得
			oldSysid0351 = retKK0351.getString(KK0351ETMsg.SYSID);

			// 遷移状態判定
			strOpSvcKeiStat = null;
			strOpSvcKeiStat = retKK0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT);
			boolean isStatus = false;
			for (int i = 0; i < STATE_CONTENTS.length; i++)
			{
				if (STATE_CONTENTS[i].equals(strOpSvcKeiStat))
				{
					isStatus = true;
					break;
				}
			}

			if (isStatus)
			{

				// オプションサービス契約お客様変更処理を行う。
				retKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, retKK0351.getString(KK0351ETMsg.OP_SVC_KEI_NO));
				retKK0351.set(KK0351ETMsg.GENE_ADD_DTM, JKKModelCommon.getSysDateTimeStamp());
				retKK0351.set(KK0351ETMsg.SYSID, sysid);
				retKK0351.set(KK0351ETMsg.MSKM_DTL_NO, mskmDtlNo);
				retKK0351.set(KK0351ETMsg.RSV_APLY_YMD, rsvAplyYmd);
				retKK0351.set(KK0351ETMsg.RSV_APLY_CD, RSV_APLY_CD_KAKUTEI);
				retKK0351.set(KK0351ETMsg.IDO_DIV, idoDiv);
				retKK0351.set(KK0351ETMsg.ADD_DTM, inCbsMsg.getString(EKK0081C250CBSMsg.OPERATEDATETIME));
				retKK0351.set(KK0351ETMsg.ADD_OPEACNT, inCbsMsg.getString(EKK0081C250CBSMsg.ADD_OPEACNT));
				retKK0351.set(KK0351ETMsg.UPD_DTM, inCbsMsg.getString(EKK0081C250CBSMsg.OPERATEDATETIME));
				retKK0351.set(KK0351ETMsg.UPD_OPEACNT, inCbsMsg.getString(EKK0081C250CBSMsg.UPD_OPEACNT));
				retKK0351.setNull(KK0351ETMsg.DEL_DTM);
				retKK0351.setNull(KK0351ETMsg.DEL_OPEACNT);
				retKK0351.set(KK0351ETMsg.MK_FLG, MK_FLG_YUKO);

				create(retKK0351);

				// オプションサービス契約サブタイプ登録処理の呼び出し
				JKKejbKK0351SubTypeCreate instance = new JKKejbKK0351SubTypeCreate(inCbsMsg);
				instance.setOpSvcKeiNo(retKK0351.getString(KK0351ETMsg.OP_SVC_KEI_NO));
				instance.setGeneAddDtm(retKK0351.getString(KK0351ETMsg.GENE_ADD_DTM));
				instance.createSubTypeKK0351();

				// オプションサービス判定し、オプトインメール受信設定副次部品を呼び出す。
				strOpSvcCd = null;
				strOpSvcCd = retKK0351.getString(KK0351ETMsg.OP_SVC_CD);
				if (OP_KEI_CD_EMAIL.equals(strOpSvcCd))
				{

					// オプションサービス契約<ISP>カレントレコードの照会を行う。
					CAANMsg inETMsg0361 = new CAANMsg(KK0361ETMsg.class.getName());
					inETMsg0361.set(KK0361ETMsg.OP_SVC_KEI_NO, retKK0351.getString(KK0351ETMsg.OP_SVC_KEI_NO));

					JKKejbKK0361DBABase kk0361DB = new JKKejbKK0361DBABase();
					CAANMsg retKK0361 = kk0361DB.findByCurrent(inETMsg0361);

					if (retKK0361 == null)
					{
						return;
					}

					// 引数設定
					String newSysid = sysid;
					String mlad = retKK0361.getString(KK0361ETMsg.MLAD);
					
					// オプトインメール受信設定次処理部品
					JCKejbCK0141SecProc ck0141 = new JCKejbCK0141SecProc();

					ck0141.optinMRcvSetteCustChg(inCbsMsg, newSysid, mlad, oldSysid0351, rsvAplyYmd);
				}

			}
		}
		catch (CAANCreateException e1)
		{
			throw new CAANRuntimeException(e1);
		}

	}
	
	// OM-2017-0000920対応 20170920 星野 ADD START
	/**
	 * オプションサービス契約のお客様変更の登録（未来日レコード分）を行います。
	 * @param inCbsMsg CBSメッセージ
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sysid SYSID
	 * @param rsvAplyYmd 予約適用年月日
	 */
	private void opSvKeiCustChgUpdateFuture(CAANMsg inCbsMsg, String opSvcKeiNo, String sysid, String rsvAplyYmd) {
		try 
		{
			// 予約検索用メッセージ作成
			CAANMsg searchETMsg = new CAANMsg(KK0351ETMsg.class.getName());
			searchETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
			searchETMsg.set(KK0351ETMsg.RSV_APLY_YMD, rsvAplyYmd);

			// 予約検索を行う
			CAANMsg[] retMsgList = super.findByReserve(searchETMsg);
			
			if(retMsgList == null){
				return;
			}			

			for(CAANMsg retKK0351: retMsgList){

				if (retKK0351 == null)
				{
					return;
				}
	
				// 遷移状態判定
				String strOpSvcKeiStat = retKK0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT);
				boolean isStatus = false;
				for (int i = 0; i < STATE_CONTENTS.length; i++)
				{
					if (STATE_CONTENTS[i].equals(strOpSvcKeiStat))
					{
						isStatus = true;
						break;
					}
				}
	
				if (isStatus)
				{
					// オプションサービス契約お客様変更処理を行う。
					CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());

					inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, retKK0351.getString(KK0351ETMsg.OP_SVC_KEI_NO));
					inETMsg.set(KK0351ETMsg.GENE_ADD_DTM, retKK0351.getString(KK0351ETMsg.GENE_ADD_DTM));
					
					inETMsg.set(KK0351ETMsg.SYSID, sysid);
					
					inETMsg.set(KK0351ETMsg.UPD_DTM, inCbsMsg.getString(EKK0081C250CBSMsg.OPERATEDATETIME));
					inETMsg.set(KK0351ETMsg.UPD_OPEACNT, inCbsMsg.getString(EKK0081C250CBSMsg.UPD_OPEACNT));
					
					super.update(inETMsg);
				}
			}
		} 
		catch (CAANFinderException e1) 
		{
			throw new CAANRuntimeException(e1);
		}
	}
	// OM-2017-0000920対応 20170920 星野 ADD END

	/**
	 * <p>
	 * オプションサービス契約の休止・中断または休止解除・中断解除データを作成します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo　サービス契約番号
	 * @param svcKeiUcwkNo　サービス契約内訳番号
	 * @param mskmDtlNo　申込明細番号
	 * @param rsvAplyYmd　予約適用年月日
	 * @param pause_stp_cd　休止中断コード
	 * @param svc_pause_ymd　サービス休止年月日
	 * @param svc_pause_rsn_cd　サービス休止理由コード
	 * @param svc_pause_rsn_memo　サービス休止理由メモ
	 * @param svc_pause_rls_ymd　サービス休止解除年月日
	 * @param svc_pause_rls_rsn_cd　サービス休止解除理由コード
	 * @param svc_pause_rls_rsn_memo　サービス休止解除理由メモ
	 * @param svc_pause_chrg_sta_ymd　サービス休止課金開始年月日
	 * @param idoDiv　異動区分
	 * @param kbn　休止・中断区分フラグ（true:「休止・中断」、false:「休止解除・中断解除」）
	 */
	private void opSvKeiPause(CAANMsg inCBSMsg, AgentDispatchContext inContext,  String svcKeiNo, String svcKeiUcwkNo,
			String mskmDtlNo, String rsvAplyYmd, String pause_stp_cd, String svc_pause_ymd, String svc_pause_rsn_cd, String svc_pause_rsn_memo,
			String svc_pause_rls_ymd, String svc_pause_rls_rsn_cd, String svc_pause_rls_rsn_memo, 
			String svc_pause_chrg_sta_ymd, String idoDiv, boolean kbn)
	{
		
		// オプションサービス契約の一覧照会を行う
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		if(svcKeiNo != null)
		{
			inETMsg.set(KK0351ETMsg.SVC_KEI_NO, svcKeiNo);
		}
		else if(svcKeiUcwkNo != null)
		{
			inETMsg.set(KK0351ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		}

		KK0351LE kk0351 = new KK0351LE();
		CAANMsg[] otETMsg = null;

		try
		{
			otETMsg = kk0351.findByCondition(inETMsg);
		}
		catch (CAANException e1)
		{
			throw new CAANRuntimeException(e1);
		}

		// サービス契約に紐付く契約が存在しない場合は終了
		int listCnt = otETMsg.length;
		if (listCnt < 1)
		{
			return;
		}

		// 処理済みオプションサービス契約保持用
		HashMap<String, String> hash = new HashMap<String, String>();

		try
		{
			for (int j = 0; j < listCnt; j++)
			{
				if (hash.containsKey(otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO)))
				{
					continue;
				}

				// 読み込んだオプションサービス契約番号を控える
				hash.put(otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO), otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO));

				CAANMsg inMsg = new CAANMsg(KK0351ETMsg.class.getName());
				inMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, otETMsg[j].getString(KK0351ETMsg.OP_SVC_KEI_NO));
				inMsg.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
				CAANMsg retCurrent = new JKKejbKK0351DBABase().findByCurrent(inMsg);

				if(retCurrent == null)
				{
					continue;
				}

				String stat = retCurrent.getString(KK0351ETMsg.OP_SVC_KEI_STAT);

				//休止・中断の場合かつカレントステータスが「サービス提供中」の場合、「休止・中断中」のデータを作成する
				//休止解除・中断解除の場合かつステータスが「休止・中断中」の場合、「サービス提供中」のデータを作成する
				if("100".equals(stat) && kbn)
				{
					stat = "210";
				}
				else if("210".equals(stat) && !kbn)
				{
					stat = "100";
				}
				else
				{
					//条件にあてはまらない場合は何もしない。
					continue;
				}

				// オプションサービス契約 新規レコード用Msg生成
				CAANMsg createMsg = retCurrent;

				// 新規レコード用メッセージ設定
				createMsg.set(KK0351ETMsg.GENE_ADD_DTM, (String)JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
				createMsg.set(KK0351ETMsg.OP_SVC_KEI_STAT, stat);
				if(!"EKK0161C070".equals(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY)))
				{
					createMsg.set(KK0351ETMsg.MSKM_DTL_NO, mskmDtlNo);
				}

				createMsg.set(KK0351ETMsg.RSV_APLY_YMD, rsvAplyYmd);
				createMsg.set(KK0351ETMsg.RSV_APLY_CD, "2");

				if(kbn)
				{
					//休止・中断の場合
					createMsg.set(KK0351ETMsg.PAUSE_STP_CD, pause_stp_cd);
					createMsg.set(KK0351ETMsg.SVC_PAUSE_YMD, svc_pause_ymd);
					createMsg.set(KK0351ETMsg.SVC_PAUSE_RSN_CD, svc_pause_rsn_cd);
					createMsg.set(KK0351ETMsg.SVC_PAUSE_RSN_MEMO, svc_pause_rsn_memo);
					createMsg.setNull(KK0351ETMsg.SVC_PAUSE_RLS_YMD);
					createMsg.setNull(KK0351ETMsg.SVC_PAUSE_RLS_RSN_CD);
					createMsg.setNull(KK0351ETMsg.SVC_PAUSE_RLS_RSN_MEMO);

					createMsg.set(KK0351ETMsg.SVC_PAUSE_CHRG_STA_YMD, svc_pause_chrg_sta_ymd);
				}
				else
				{
					//休止解除・中断解除の場合
					createMsg.set(KK0351ETMsg.PAUSE_STP_CD, retCurrent.getString(KK0351ETMsg.PAUSE_STP_CD));
					createMsg.set(KK0351ETMsg.SVC_PAUSE_YMD, retCurrent.getString(KK0351ETMsg.SVC_PAUSE_YMD));
					createMsg.set(KK0351ETMsg.SVC_PAUSE_RSN_CD, retCurrent.getString(KK0351ETMsg.SVC_PAUSE_RSN_CD));
					createMsg.set(KK0351ETMsg.SVC_PAUSE_RSN_MEMO, retCurrent.getString(KK0351ETMsg.SVC_PAUSE_RSN_MEMO));
					createMsg.set(KK0351ETMsg.SVC_PAUSE_RLS_YMD, svc_pause_rls_ymd);
					createMsg.set(KK0351ETMsg.SVC_PAUSE_RLS_RSN_CD, svc_pause_rls_rsn_cd);
					createMsg.set(KK0351ETMsg.SVC_PAUSE_RLS_RSN_MEMO, svc_pause_rls_rsn_memo);

					createMsg.set(KK0351ETMsg.SVC_PAUSE_CHRG_STA_YMD, retCurrent.getString(KK0351ETMsg.SVC_PAUSE_CHRG_STA_YMD));

				}

				createMsg.set(KK0351ETMsg.IDO_DIV, idoDiv);

				createMsg.set(KK0351ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
				createMsg.set(KK0351ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
				createMsg.set(KK0351ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
				createMsg.set(KK0351ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
				createMsg.setNull(KK0351ETMsg.DEL_DTM);
				createMsg.setNull(KK0351ETMsg.DEL_OPEACNT);
				createMsg.set(KK0351ETMsg.MK_FLG, "0");

				// 登録処理の実行
				create(createMsg);

				//紐づく機器提供サービス契約とサブオプションサービス契約を
				//作成する
				String opSvcKeiNo = retCurrent.getString(KK0351ETMsg.OP_SVC_KEI_NO);

				JKKejbKK0341SecProc kiki = new JKKejbKK0341SecProc();
				kiki.execFromOpSvcKei(inCBSMsg, inContext, opSvcKeiNo, mskmDtlNo, rsvAplyYmd, 
						pause_stp_cd, svc_pause_ymd, svc_pause_rsn_cd, svc_pause_rsn_memo, 
						svc_pause_rls_ymd, svc_pause_rls_rsn_cd, svc_pause_rls_rsn_memo, 
						svc_pause_chrg_sta_ymd, idoDiv, kbn);

				JKKejbKK0401SecProc sbOpSvcKei = new JKKejbKK0401SecProc();
				sbOpSvcKei.execFromOpSvcKei(inCBSMsg, inContext, opSvcKeiNo, mskmDtlNo, rsvAplyYmd, 
						pause_stp_cd, svc_pause_ymd, svc_pause_rsn_cd, svc_pause_rsn_memo, 
						svc_pause_rls_ymd, svc_pause_rls_rsn_cd, svc_pause_rls_rsn_memo, 
						svc_pause_chrg_sta_ymd, idoDiv, kbn);


				// オプションサービス契約サブタイプ登録処理の呼び出し
				JKKejbKK0351SubTypeCreate instance = new JKKejbKK0351SubTypeCreate(inCBSMsg);
				instance.setOpSvcKeiNo(opSvcKeiNo);
				instance.setGeneAddDtm(createMsg.getString(KK0351ETMsg.GENE_ADD_DTM));
				instance.createSubTypeKK0351();
			}

		}
		catch (CAANCreateException e1)
		{
			throw new CAANRuntimeException(e1);
		}

	}

	/**
	 * <p>
	 * サービス契約に紐付くオプションサービス契約のステータスの変更を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svc_kei_no　サービス契約番号
	 * @param gene_add_dtm　世代登録年月日時分秒
	 */
	public void execFromSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svc_kei_no, String gene_add_dtm)
	{
		
		// サービス契約の照会を行う
		CAANMsg inETMsgCurrent = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsgCurrent.set(KK0081ETMsg.SVC_KEI_NO, svc_kei_no);
		inETMsgCurrent.set(KK0081ETMsg.GENE_ADD_DTM, gene_add_dtm);
		CAANMsg otETMsg = new JKKejbKK0081DBABase().findByPrimaryKey(inETMsgCurrent);
		
		// サービス契約内訳が存在しない場合は終了
		if (otETMsg == null)
		{
			return;
		}

		//紐づくオプションサービス契約・機器提供サービス契約を
		//作成する。
		String mskmDtlNo = otETMsg.getString(KK0081ETMsg.MSKM_DTL_NO);
		String rsvAplyYmd = otETMsg.getString(KK0081ETMsg.RSV_APLY_YMD);
		String pause_stp_cd = otETMsg.getString(KK0081ETMsg.PAUSE_STP_CD);
		String svc_pause_ymd = otETMsg.getString(KK0081ETMsg.SVC_PAUSE_YMD);
		String svc_pause_rsn_cd = otETMsg.getString(KK0081ETMsg.SVC_PAUSE_RSN_CD);
		String svc_pause_rsn_memo = otETMsg.getString(KK0081ETMsg.SVC_PAUSE_RSN_MEMO);
		String svc_pause_rls_ymd = otETMsg.getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD);
		String svc_pause_rls_rsn_cd = otETMsg.getString(KK0081ETMsg.SVC_PAUSE_RLS_RSN_CD);
		String svc_pause_rls_rsn_memo = otETMsg.getString(KK0081ETMsg.SVC_PAUSE_RLS_RSN_MEMO);
		String svc_pause_chrg_sta_ymd = otETMsg.getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD);
		String idoDiv = otETMsg.getString(KK0081ETMsg.IDO_DIV);
		String svc_kei_stat = otETMsg.getString(KK0081ETMsg.SVC_KEI_STAT);
		
		//サービス契約のステータスが「休止・中断中」の場合、区分にtrueを設定
		//サービス契約のステータスが「休止・中断中」でない場合、区分にfalseを設定
		boolean kbn = true;
		if(!"210".equals(svc_kei_stat))
		{
			kbn = false;
		}

		// 登録処理メソッド呼び出し
		opSvKeiPause(inCBSMsg, inContext, svc_kei_no, null, mskmDtlNo, rsvAplyYmd, 
				pause_stp_cd, svc_pause_ymd, svc_pause_rsn_cd, svc_pause_rsn_memo, 
				svc_pause_rls_ymd, svc_pause_rls_rsn_cd, svc_pause_rls_rsn_memo, 
				svc_pause_chrg_sta_ymd, idoDiv, kbn);
		
	}

	/**
	 * <p>
	 * サービス契約内訳に紐付くオプションサービス契約のステータスの変更を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiUcwkNo　サービス契約内訳番号
	 * @param mskmDtlNo　申込明細番号
	 * @param rsvAplyYmd　予約適用年月日
	 * @param pause_stp_cd　休止中断コード
	 * @param svc_pause_ymd　サービス休止年月日
	 * @param svc_pause_rsn_cd　サービス休止理由コード
	 * @param svc_pause_rsn_memo　サービス休止理由メモ
	 * @param svc_pause_rls_ymd　サービス休止解除年月日
	 * @param svc_pause_rls_rsn_cd　サービス休止解除理由コード
	 * @param svc_pause_rls_rsn_memo　サービス休止解除理由メモ
	 * @param svc_pause_chrg_sta_ymd　サービス休止課金開始年月日
	 * @param idoDiv　異動区分
	 * @param kbn　休止・中断区分フラグ（true:「休止・中断」、false:「休止解除・中断解除」）
	 */
	public void execFromSvcKeiUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiUcwkNo, String mskmDtlNo,
			String rsvAplyYmd, String pause_stp_cd, String svc_pause_ymd, String svc_pause_rsn_cd, String svc_pause_rsn_memo,
			String svc_pause_rls_ymd, String svc_pause_rls_rsn_cd, String svc_pause_rls_rsn_memo, String svc_pause_chrg_sta_ymd,
			String idoDiv, boolean kbn)
	{
		// 登録処理メソッド呼び出し
		opSvKeiPause(inCBSMsg, inContext, null, svcKeiUcwkNo, mskmDtlNo, rsvAplyYmd, 
				pause_stp_cd, svc_pause_ymd, svc_pause_rsn_cd, svc_pause_rsn_memo, 
				svc_pause_rls_ymd, svc_pause_rls_rsn_cd, svc_pause_rls_rsn_memo, 
				svc_pause_chrg_sta_ymd, idoDiv, kbn);
		
	}

	/**
	 * <p>
	 * サービス契約内訳に紐付くオプションサービス契約のステータスの変更を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiUcwkNo　サービス契約内訳番号
	 * @param gene_add_dtm　世代登録年月日時分秒
	 */
	public void execFromSvcKeiUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiUcwkNo, String gene_add_dtm)
	{
		
		CAANMsg inMsgKK0161 = new CAANMsg(KK0161ETMsg.class.getName());
		inMsgKK0161.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		inMsgKK0161.set(KK0161ETMsg.GENE_ADD_DTM, gene_add_dtm);
		CAANMsg otETMsg = new JKKejbKK0161DBABase().findByPrimaryKey(inMsgKK0161);

		// サービス契約内訳が存在しない場合は終了
		if (otETMsg == null)
		{
			return;
		}

		//紐づくオプションサービス契約・機器提供サービス契約を
		//作成する。
		String mskmDtlNo = otETMsg.getString(KK0161ETMsg.MSKM_DTL_NO);
		
		//サービス契約内訳中断解除のときのみ申込明細番号を受け渡さない（カレントレコードの値を設定）
		if("EKK0161C070".equals(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY)))
		{
			mskmDtlNo = null;
		}
		
		String rsvAplyYmd = otETMsg.getString(KK0161ETMsg.RSV_APLY_YMD);
		String pause_stp_cd = otETMsg.getString(KK0161ETMsg.PAUSE_STP_CD);
		String svc_pause_ymd = otETMsg.getString(KK0161ETMsg.SVC_PAUSE_YMD);
		String svc_pause_rsn_cd = otETMsg.getString(KK0161ETMsg.SVC_PAUSE_RSN_CD);
		String svc_pause_rsn_memo = otETMsg.getString(KK0161ETMsg.SVC_PAUSE_RSN_MEMO);
		String svc_pause_rls_ymd = otETMsg.getString(KK0161ETMsg.SVC_PAUSE_RLS_YMD);
		String svc_pause_rls_rsn_cd = otETMsg.getString(KK0161ETMsg.SVC_PAUSE_RLS_RSN_CD);
		String svc_pause_rls_rsn_memo = otETMsg.getString(KK0161ETMsg.SVC_PAUSE_RLS_RSN_MEMO);
		String svc_pause_chrg_sta_ymd = otETMsg.getString(KK0161ETMsg.SVC_PAUSE_CHRG_STA_YMD);
		String idoDiv = otETMsg.getString(KK0161ETMsg.IDO_DIV);
		String svc_kei_stat = otETMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT);
		
		//サービス契約のステータスが「休止・中断中」の場合、区分にtrueを設定
		//サービス契約のステータスが「休止・中断中」でない場合、区分にfalseを設定
		boolean kbn = true;
		if(!"210".equals(svc_kei_stat))
		{
			kbn = false;
		}

		// 登録処理メソッド呼び出し
		opSvKeiPause(inCBSMsg, inContext, null, svcKeiUcwkNo, mskmDtlNo, rsvAplyYmd, 
				pause_stp_cd, svc_pause_ymd, svc_pause_rsn_cd, svc_pause_rsn_memo, 
				svc_pause_rls_ymd, svc_pause_rls_rsn_cd, svc_pause_rls_rsn_memo, 
				svc_pause_chrg_sta_ymd, idoDiv, kbn);
	}

	/**
	 * <p>
	 * 指定されたオプションサービス契約番号に紐付く予約の取消、および自動予約取消ワークの登録を行います。
	 * </p>
	 * @param opSvcKeiNo 取り消し対象のオプションサービス契約番号
	 * @param idoDiv 異動区分
	 * @param mskmDtlNo 申込明細番号
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 * @param autoRsvClStatCd 自動予約取消状態コード("取消済"/"自動予約取消未実施"：予約取消を実施する/しない)
	 */
	public void cancelReserve(String opSvcKeiNo, String idoDiv, String mskmDtlNo,
			String opeDate, String updDtm, String updOpeAct, String autoRsvClStatCd)
	{
		// オプションサービス契約スキーマの予約取消
		
		// 予約検索用メッセージ作成
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);

		// 予約検索を行う
		CAANMsg[] retMsgList = super.findByReserve(inETMsg);

		// 取得した予約レコードを全て取り消す
		for (CAANMsg retMsg : retMsgList)
		{
			// 自動予約取消状態コードが"取消済"の場合のみ、予約取消実施
			if (JKKModelConst.AUTO_RSV_CL_STAT_CD_CL_ZM.equals(autoRsvClStatCd))
			{
				updateKK0351ClRsv(retMsg, opeDate, updDtm, updOpeAct);
			}
			// 自動予約取消ワークに登録します
			this.createKK2791GymSchema(retMsg, idoDiv, mskmDtlNo, updDtm, updOpeAct, autoRsvClStatCd);
		}

		// 異動予約スキーマの予約取消

		// 予約検索を行う
		List<CAANMsg> retList = new JKKejbIdoRsvAccess().getIdoRsvOpSvcKeiNo(opSvcKeiNo, opeDate);

		// 予約レコードが存在した場合は取り消す
		for (CAANMsg retIdoRsv : retList)
		{
			// ただし、申込明細番号が同一のものは処理しない
			if (mskmDtlNo != null && !mskmDtlNo.equals(retIdoRsv.getString(KK1681ETMsg.MSKM_DTL_NO)))
			{
				// 自動予約取消状態コードが"取消済"の場合のみ、予約取消実施
				if (JKKModelConst.AUTO_RSV_CL_STAT_CD_CL_ZM.equals(autoRsvClStatCd))
				{
					new JKKejbKK1681SecProc().updateKK1681ClRsv(retIdoRsv, opeDate, updDtm, updOpeAct);
				}
				// 自動予約取消ワークに登録します
				this.createKK2791IdoRsv(retIdoRsv, idoDiv, mskmDtlNo, updDtm, updOpeAct, autoRsvClStatCd);
			}
		}
	}
	
	/**
	 * <p>
	 * 自動予約取消ワークにオプションサービス契約の予約情報を登録します
	 * </p>
	 * @param kk0351EtMsg ETメッセージ
	 * @param idoDiv 異動区分
	 * @param mskmDtlNo 申込明細番号
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 * @param autoRsvClStatCd 自動予約取消状態コード
	 */
	private void createKK2791GymSchema(CAANMsg kk0351EtMsg, String idoDiv, String mskmDtlNo, String updDtm, String updOpeAct, String autoRsvClStatCd)
	{
		// 自動予約取消ワークＤＢ操作部品のインスタンス化
		JKKejbKK2791ETDA kk2791etda = new JKKejbKK2791ETDA();

		// 取消契機異動区分
		kk2791etda.setCl_opty_ido_div(idoDiv);
		// 取消契機申込明細番号
		kk2791etda.setCl_opty_mskm_dtl_no(mskmDtlNo);
		// オプションサービス契約番号
		kk2791etda.setOp_svc_kei_no(kk0351EtMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		// 予約契機異動区分
		kk2791etda.setRsv_opty_ido_div(kk0351EtMsg.getString(KK0351ETMsg.IDO_DIV));
		// 予約契機申込明細番号
		kk2791etda.setRsv_opty_mskm_dtl_no(kk0351EtMsg.getString(KK0351ETMsg.MSKM_DTL_NO));
		// 予約適用年月日
		kk2791etda.setRsv_aply_ymd(kk0351EtMsg.getString(KK0351ETMsg.RSV_APLY_YMD));
		// 各種スキーマ世代登録年月日時分秒
		kk2791etda.setVari_schma_gene_add_dtm(kk0351EtMsg.getString(KK0351ETMsg.GENE_ADD_DTM));
		// 予約適用コード
		kk2791etda.setRsv_aply_cd(kk0351EtMsg.getString(KK0351ETMsg.RSV_APLY_CD));
		// 登録年月日時分秒
		kk2791etda.setAdd_dtm(updDtm);
		// 登録オペレータアカウント
		kk2791etda.setAdd_opeacnt(updOpeAct);
		// 更新年月日時分秒
		kk2791etda.setUpd_dtm(updDtm);
		// 更新オペレータアカウント
		kk2791etda.setUpd_opeacnt(updOpeAct);

		// 自動予約取消ワークの登録
		kk2791etda.createKK2791(kk0351EtMsg, "KK0351", autoRsvClStatCd);
	}

	/**
	 * <p>
	 * 自動予約取消ワークに異動予約の予約情報を登録します
	 * </p>
	 * @param kk1681EtMsg ETメッセージ
	 * @param idoDiv 異動区分
	 * @param mskmDtlNo 申込明細番号
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 * @param autoRsvClStatCd 自動予約取消状態コード
	 */
	private void createKK2791IdoRsv(CAANMsg kk1681EtMsg, String idoDiv, String mskmDtlNo, String updDtm, String updOpeAct, String autoRsvClStatCd)
	{
		// 自動予約取消ワークＤＢ操作部品のインスタンス化
		JKKejbKK2791ETDA kk2791etda = new JKKejbKK2791ETDA();

		// 取消契機異動区分
		kk2791etda.setCl_opty_ido_div(idoDiv);
		// 取消契機申込明細番号
		kk2791etda.setCl_opty_mskm_dtl_no(mskmDtlNo);
		// 登録年月日時分秒
		kk2791etda.setAdd_dtm(updDtm);
		// 登録オペレータアカウント
		kk2791etda.setAdd_opeacnt(updOpeAct);
		// 更新年月日時分秒
		kk2791etda.setUpd_dtm(updDtm);
		// 更新オペレータアカウント
		kk2791etda.setUpd_opeacnt(updOpeAct);

		// 自動予約取消ワークの登録
		kk2791etda.createKK2791(kk1681EtMsg, "KK1681", autoRsvClStatCd);
	}

	/**
	 * <p>
	 * 該当の「オプションサービス契約」を回復(または解約取消)する際に、予約適用年月日が到来済の予約を取り消します。
	 * </p>
	 * @param opSvcKeiNo 回復(または解約取消)対象のオプションサービス契約番号
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	public void cancelReserveForKaihk(String opSvcKeiNo, String opeDate, String updDtm, String updOpeAct)
	{
		// 予約検索を行う
		List<CAANMsg> kk1681MsgList = new JKKejbIdoRsvAccess().getIdoRsvOpSvcKeiNo(opSvcKeiNo, opeDate);

		// 予約取消対象となる「異動予約」(予約適用年月日が到来済、かつ予約未反映)リスト
		JKKejbKK1681SecProc kk1681sp = new JKKejbKK1681SecProc();
		kk1681MsgList = kk1681sp.getIdoRsvForKaihkJiRsvCl(kk1681MsgList, opeDate);
		for (CAANMsg kk1681Msg : kk1681MsgList)
		{
			kk1681sp.updateKK1681ClRsv(kk1681Msg, opeDate, updDtm, updOpeAct);

			// 該当の予約と同時に作成された各種契約のインスタンスを削除する。
			kk1681sp.deleteInstanceForRsvCl(kk1681Msg, opeDate, updDtm, updOpeAct);
		}
	}

	/**
	 * <p>
	 * 指定されたオプションサービス契約番号に紐付く予約（該当の「オプションサービス契約」レコードのうち、未来日での予約確定レコード）を解約します。
	 * </p>
	 * @param opSvcKeiNo 解約対象のオプションサービス契約番号
	 * @param opeDate 運用日付
	 * @param svcEndymd サービス終了年月日
	 * @param svcChrgEndYmd サービス課金終了年月日
	 * @param svcDlreCd サービス解約理由コード
	 * @param svcDlreMemo サービス解約理由メモ
	 * @param dslTntUserId 解約担当ユーザーID
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	public void dslRsvFixRec(String opSvcKeiNo, String opeDate, String svcEndymd, 
			String svcChrgEndymd, String svcDlreCd, String svcDlreMemo, String dslTntUserId, String updDtm, String updOpeAct)
	{
		/* ------------------------------------------------------------------------------------------------------------------------
		 * 予約中の強制解約、および住所変更予約中の解約の場合、回復時に予約情報を反映する必要があるため予約取消は行わない。
		 * ※ただし、未来日・予約確定レコードについては、予約適用年月日が到来した時点で、カレントレコードとなってしまうため、
		 *   以下の更新処理を行う。
		 * (1)予約解約(キャンセル)：解約時に予約レコードを"解約済"とする。
		 * (2)予約回復(キャンセル取消)：回復時に予約レコードを元のステータスに回復する。（現時点では、住所変更中の解約／回復に対してのみ実施する。）
		 * ------------------------------------------------------------------------------------------------------------------------ */
		
		// 該当の「オプションサービス契約」レコードの予約確定レコードを取得する。
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0351ETMsg.RSV_APLY_CD, JKKModelConst.RSV_APLY_CD_RSV_FIX);
		inETMsg.set(KK0351ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

		CAANMsg[] retMsg = null;
		try
		{
			retMsg = new KK0351LE().findByCondition(inETMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		// 予約解約実行
		for (int i = 0; i < retMsg.length; i++)
		{
			// 予約適用年月日＞運用日付の予約確定レコードのみ解約する。
			if (JKKModelCommon.isFutureDate(retMsg[i].getString(KK0351ETMsg.RSV_APLY_YMD), opeDate, "0"))
			{
				updateKK0351DslRsv(retMsg[i], svcEndymd, svcChrgEndymd, svcDlreCd, svcDlreMemo, dslTntUserId, updDtm, updOpeAct);
			}
		}
	}

	/**
	 * <p>
	 * 指定されたオプションサービス契約契約番号に紐付く、オプションサービス契約契約スキーマの予約レコードを解約します。
	 * </p>
	 * @param inMsg 予約検索の結果を保持するメッセージキャリア
	 * @param svcEndymd サービス終了年月日
	 * @param svcChrgEndYmd サービス課金終了年月日
	 * @param svcDlreCd サービス解約理由コード
	 * @param svcDlreMemo サービス解約理由メモ
	 * @param dslTntUserId 解約担当ユーザーID
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	private void updateKK0351DslRsv(CAANMsg inMsg, String svcEndymd, String svcChrgEndYmd, String svcDlreCd, String svcDlreMemo, String dslTntUserId, String updDtm, String updOpeAct)
	{
		// 更新用メッセージ作成
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());

		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0351ETMsg.GENE_ADD_DTM, inMsg.getString(KK0351ETMsg.GENE_ADD_DTM));
		// オプションサービス契約契約ステータス
		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_STAT, JKKModelConst.SVC_KEI_STAT_DSL_ZM);
		// プラン終了年月日
		inETMsg.set(KK0351ETMsg.PLAN_ENDYMD, svcEndymd);
		// プラン課金終了年月日
		inETMsg.set(KK0351ETMsg.PLAN_CHRG_ENDYMD, svcChrgEndYmd);
		// サービス終了年月日
		inETMsg.set(KK0351ETMsg.SVC_ENDYMD, svcEndymd);
		// サービス課金終了年月日
		inETMsg.set(KK0351ETMsg.SVC_CHRG_ENDYMD, svcChrgEndYmd);
		// サービス解約年月日
		inETMsg.set(KK0351ETMsg.SVC_DSL_YMD, svcEndymd);
		// サービス解約理由コード
		inETMsg.set(KK0351ETMsg.SVC_DLRE_CD, svcDlreCd);
		// サービス解約理由メモ
		inETMsg.set(KK0351ETMsg.SVC_DLRE_MEMO, svcDlreMemo);
		// 解約担当ユーザーID
		inETMsg.set(KK0351ETMsg.DSL_TNT_USER_ID, dslTntUserId);
		
		inETMsg.set(KK0351ETMsg.UPD_DTM, updDtm);
		inETMsg.set(KK0351ETMsg.UPD_OPEACNT, updOpeAct);
		
		// 更新を行う
		try
		{
			super.update(inETMsg);
		}
		catch (CAANFinderException cfe)
		{
			throw new CAANRuntimeException(cfe);
		}
	}

	/**
	 * 指定されたオプションサービス契約番号に紐付く、オプションサービス契約スキーマの予約を取り消します。
	 * @param inMsg 予約検索の結果を保持するメッセージキャリア
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	private void updateKK0351ClRsv(CAANMsg inMsg, String opeDate, String updDtm, String updOpeAct)
	{
		// 更新用メッセージ作成
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());

		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0351ETMsg.GENE_ADD_DTM, inMsg.getString(KK0351ETMsg.GENE_ADD_DTM));
		inETMsg.set(KK0351ETMsg.RSV_CL_YMD, opeDate);
		inETMsg.set(KK0351ETMsg.RSV_APLY_CD, RSV_CANCEL);
		inETMsg.set(KK0351ETMsg.UPD_DTM, updDtm);
		inETMsg.set(KK0351ETMsg.UPD_OPEACNT, updOpeAct);

		// 更新を行う
		try
		{
			super.update(inETMsg);
		}
		catch (CAANFinderException cfe)
		{
			throw new CAANRuntimeException(cfe);
		}
	}

}
