/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbKK0401SecProc
 *	ソースファイル名：JKKejbKK0401SecProc.java
 *	作成者			：富士通
 *	日付			：2011年10月17日
 *＜機能概要＞
 *	サブオプションサービス契約の副次処理を行う部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/10/17	FJ)			新規作成
 *	v4.00.00	2013/04/16	FJ)阿部		IT1-2012-0000903
 *	v5.00.00	2013/07/09	FJ)寺園		LT-2013-0000321
 *  v5.00.01    2013/07/26  FJ)寺本     IT2-2013-0000668
 *  v5.00.02    2013/11/12  FJ)小島     OM-2013-0003921
 *  v9.00.01    2014/08/01  FJ)中野     OM-2014-0002482
 * v32.00.03    2017/06/22  FJ)三原     ANK-3149-20-00_新セキュリティパック導入(メールウィルスチェックの自動登録)
 * v32.00.04    2017/08/01  FJ)三原     OM-2017-0000816_ウィルスチェックが解約できない
 **********************************************************************/

package eo.ejb.common.db;

import java.util.ArrayList;
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.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.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0351LE;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0401LE;
import eo.ejb.cbm.entity.KK0451ETMsg;
import eo.ejb.cbm.entity.KK0481ETMsg;
import eo.ejb.cbm.entity.KK0481LE;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.ZM0321ETMsg;
import eo.ejb.cbm.entity.ZM0321LE;
import eo.ejb.cbs.cbsmsg.EKK0361C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361D010CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.JKKejbCallTypeChecker;
import eo.ejb.common.entity.JKKejbIdoRsvAccess;

/**
 * <p>
 * サービス契約内訳の副次処理を行うクラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0401SecProc extends JKKejbKK0401DBABase
{

	/** メールウィルスチェック登録上限数 */
	int maxValue = 0;

	/** サブオプションサービスコード メールウィルスチェック */
	private static final String SBOPCD_VIRUSCHK = "D03";
	
	/** 料金グループコード eo光ネットホームタイプ */
	private static final String PRCGRPCD_HOME = "02";
	
	/** 料金グループコード eo光ネットメゾンタイプ */
	private static final String PRCGRPCD_MEZON = "03";
	
	/** 料金グループコード eo光ネットマンションタイプ */
	private static final String PRCGRPCD_MANS = "04";
	
	/** 料金コースコード メールウィルスチェック */
	private static final String PCRSCD_VIRUSCHK = "D03";
	
	/** 料金プランコード メールウィルスチェック　定額プラン */
	private static final String PPLANCD_VIRUSCHK_FIXED = "PD0301";
	
	/** 割引サービスコード ファミリーパック割引 */
	private static final String WRIBCD_FAMILYPACK = "W00000006";
	
	/** オプションサービスコード Ｅメール */
	private static final String OPCD_EMAIL = "B001";
	
	/** 予約適用コード 予約確定 */
	private static final String RSVCD_DECIDED = "2";
	
	/** 予約適用コード 予約取消 */
	private static final String RSV_CANCEL = "3";

	/** 無効フラグ 有効 */
	private static final String MKFLG_VALID = "0";
	
	/** 業務パラメータ ファミリーパック用Ｅメール最大値（ホームタイプ） */
	private static final String WORKID_MAX_HOME = "KK_FP_EMAILMAX_HOME";
	
	/** 業務パラメータ ファミリーパック用Ｅメール最大値（メゾンタイプ） */
	private static final String WORKID_MAX_MEZON = "KK_FP_EMAILMAX_MEZON";
	
	/** 業務パラメータ ファミリーパック用Ｅメール最大値（マンションタイプ） */
	private static final String WORKID_MAX_MANS = "KK_FP_EMAILMAX_MANS";
	
	/** オプションサービス契約ステータス 解約済 */
	private static final String OPSTAT_DISSOLVED = "910";
	
	/** オプションサービス契約ステータス キャンセル済 */
	private static final String OPSTAT_CANCELED = "920";
	
	/** サブオプションサービス契約ステータス 受付済 */
	private static final String SBOPSTAT_ACCEPTED = "010";
	
	/** サブオプションサービス契約ステータス 照査済 */
	private static final String SBOPSTAT_SHOSA = "020";
	
	/** サブオプションサービス契約ステータス 締結済 */
	private static final String SBOPSTAT_CONCLUDE = "030";
	
	/** サブオプションサービス契約ステータス 解約済 */
	private static final String SBOPSTAT_DISSOLVED = "910";
	
	/** サブオプションサービス契約ステータス キャンセル済 */
	private static final String SBOPSTAT_CANCELED = "920";
	
	/** サブオプションサービス契約ステータス サービス提供中 */
	private static final String SBOPSTAT_TEIKYO = "100";

	/** 最終年月日時分秒 */
	private static final String FINAL_YMD = "20991231";

	/** 関連チェックエラーフラグ&エラー返却項目(サブオプションサービス契約 開始日確定チェック) */
	private static final String[] KRCK_SBOP_START_DECIDED_ERR = {"EC", EKK0361C040CBSMsg.OP_SVC_KEI_NO_ERR};
	
	/** 異動区分（オプション引継） */
	private static final String IDO_DIV_OP_HKTG = "00003";

	/**
	 * <p>
	 * オプションサービス契約に紐付くサブオプションサービス契約のステータスの変更を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo　オプションサービス契約番号
	 * @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 execFromOpSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo, 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(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);

		KK0401LE kk0401 = new KK0401LE();
		CAANMsg[] otETMsg = null;

		try
		{
			otETMsg = kk0401.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(KK0401ETMsg.SBOP_SVC_KEI_NO)))
				{
					continue;
				}

				// 読み込んだサービス契約内訳番号を控える
				hash.put(otETMsg[j].getString(KK0401ETMsg.SBOP_SVC_KEI_NO), otETMsg[j].getString(KK0401ETMsg.SBOP_SVC_KEI_NO));

				CAANMsg inMsg = new CAANMsg(KK0401ETMsg.class.getName());
				inMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, otETMsg[j].getString(KK0401ETMsg.OP_SVC_KEI_NO));
				inMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, otETMsg[j].getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
				inMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
				CAANMsg retCurrent = findByCurrent(inMsg);

				if(retCurrent == null)
				{
					continue;
				}

				String stat = retCurrent.getString(KK0401ETMsg.SBOP_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(KK0401ETMsg.OP_SVC_KEI_NO, retCurrent.getObject(KK0401ETMsg.OP_SVC_KEI_NO));
				createMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, retCurrent.getObject(KK0401ETMsg.SBOP_SVC_KEI_NO));
				createMsg.set(KK0401ETMsg.GENE_ADD_DTM, (String)JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
				createMsg.set(KK0401ETMsg.SBOP_SVC_KEI_STAT, stat);
				if(!"EKK0161C070".equals(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY)))
				{
					createMsg.set(KK0401ETMsg.MSKM_DTL_NO, mskmDtlNo);

				}
				createMsg.set(KK0401ETMsg.RSV_APLY_YMD, rsvAplyYmd);
				createMsg.set(KK0401ETMsg.RSV_APLY_CD, "2");

				if(kbn)
				{
					createMsg.set(KK0401ETMsg.PAUSE_STP_CD, pause_stp_cd);
					createMsg.set(KK0401ETMsg.SVC_PAUSE_YMD, svc_pause_ymd);
					createMsg.set(KK0401ETMsg.SVC_PAUSE_RSN_CD, svc_pause_rsn_cd);
					createMsg.set(KK0401ETMsg.SVC_PAUSE_RSN_MEMO, svc_pause_rsn_memo);
					createMsg.setNull(KK0401ETMsg.SVC_PAUSE_RLS_YMD);
					createMsg.setNull(KK0401ETMsg.SVC_PAUSE_RLS_RSN_CD);
					createMsg.setNull(KK0401ETMsg.SVC_PAUSE_RLS_RSN_MEMO);

					createMsg.set(KK0401ETMsg.SVC_PAUSE_CHRG_STA_YMD, svc_pause_chrg_sta_ymd);

				}
				else
				{
					createMsg.set(KK0401ETMsg.PAUSE_STP_CD, retCurrent.getString(KK0401ETMsg.PAUSE_STP_CD));
					createMsg.set(KK0401ETMsg.SVC_PAUSE_YMD, retCurrent.getString(KK0401ETMsg.SVC_PAUSE_YMD));
					createMsg.set(KK0401ETMsg.SVC_PAUSE_RSN_CD, retCurrent.getString(KK0401ETMsg.SVC_PAUSE_RSN_CD));
					createMsg.set(KK0401ETMsg.SVC_PAUSE_RSN_MEMO, retCurrent.getString(KK0401ETMsg.SVC_PAUSE_RSN_MEMO));
					createMsg.set(KK0401ETMsg.SVC_PAUSE_RLS_YMD, svc_pause_rls_ymd);
					createMsg.set(KK0401ETMsg.SVC_PAUSE_RLS_RSN_CD, svc_pause_rls_rsn_cd);
					createMsg.set(KK0401ETMsg.SVC_PAUSE_RLS_RSN_MEMO, svc_pause_rls_rsn_memo);

					createMsg.set(KK0401ETMsg.SVC_PAUSE_CHRG_STA_YMD, retCurrent.getString(KK0401ETMsg.SVC_PAUSE_CHRG_STA_YMD));
				}

				createMsg.set(KK0401ETMsg.IDO_DIV, idoDiv);
				createMsg.set(KK0401ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
				createMsg.set(KK0401ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
				createMsg.set(KK0401ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
				createMsg.set(KK0401ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
				createMsg.setNull(KK0401ETMsg.DEL_DTM);
				createMsg.setNull(KK0401ETMsg.DEL_OPEACNT);
				createMsg.set(KK0401ETMsg.MK_FLG, "0");

				// 登録処理の実行
				create(createMsg);

				// サブオプションサービス契約サブタイプ登録処理の呼び出し
				JKKejbKK0401SubTypeCreate instance = new JKKejbKK0401SubTypeCreate(inCBSMsg);
				instance.setOpSvcKeiNo(opSvcKeiNo);
				instance.setSbopSvcKeiNo(createMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
				instance.setGeneAddDtm(createMsg.getString(KK0401ETMsg.GENE_ADD_DTM));
				instance.createSubTypeKK0401();

			}
		}

		catch (CAANCreateException e1)
		{
			throw new CAANRuntimeException(e1);
		}

		return;

	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>登録メールウィルスチェック登録処理を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void createMailVirusChkOfOp(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
	
		// 条件判定
		if (!isInsCondOfOp(inCBSMsg, inContext))
		{
			return;
		}

		String svcKeiNo = inCBSMsg.getString(EKK0361D010CBSMsg.SVC_KEI_NO);

		// 共通条件判定
		if (!isProperCommonCond(inCBSMsg, inContext, svcKeiNo))
		{
			return;
		}
		
		// サブオプションサービス契約登録
		CAANMsg kk0401Info = new CAANMsg(KK0401ETMsg.class.getName());

		// 登録内容共通項目設定
		setCommonItemMailVirusChk(inCBSMsg, inContext, kk0401Info);
		
		// 登録内容個別項目設定
		setKK0401OfOp(inCBSMsg, inContext, kk0401Info);

		// サブオプションサービス契約登録
		createKK0401(kk0401Info);
		
		// サブオプションサービス契約<ISP>登録
		new JKKejbKK0411SecProc().createMailVirusChk(inCBSMsg, inContext, kk0401Info);
		
		// 課金先登録
		new JKKejbKK0321SecProc().createMailVirusChkOfOp(inCBSMsg, inContext);
		
		// 出力項目設定
		setOutItemOfOp(inCBSMsg, kk0401Info);
	}
	
	/**
	 * <p>
	 * オプションサービス契約<ISP>照査締結の副次処理（サブオプションサービス契約照査締結）を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void updateShosaConclusion(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 条件判定
		if (!isShosaCncValid(inCBSMsg, inContext, inCBSMsg.getString(EKK0361C030CBSMsg.OP_SVC_KEI_NO)))
		{
			return;
		}

		// オプションサービス契約番号に紐付く、
		// メールウィルスチェックのサブオプションサービス契約の取得を行う
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0361C030CBSMsg.OP_SVC_KEI_NO));

		CAANMsg[] retMsgKK0401 = getSbopKeiOfOpKei(inCBSMsg, inContext, inETMsgKK0351);

		// 取得されたサブオプションサービス契約の副次処理を行う
		for (CAANMsg msgKK0401 : retMsgKK0401)
		{
			// サブオプションサービス契約ステータスが"010"(受付済)以外の場合は対象としない
			if (!SBOPSTAT_ACCEPTED.equals(msgKK0401.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT)))
			{
				continue;
			}

			// カレントレコードの世代を控えておく
			String strGeneCur = msgKK0401.getString(KK0401ETMsg.GENE_ADD_DTM);
	
			// 登録内容個別項目設定
			setKK0401OfOpShosaCnc(inCBSMsg, inContext, msgKK0401);

			// サブオプションサービス契約登録
			createKK0401(msgKK0401);

			// サブオプションサービス契約<ISP>照査締結
			new JKKejbKK0411SecProc().createShosaCnc(inCBSMsg, inContext, msgKK0401, strGeneCur);
		}
	}
	
	/**
	 * <p>
	 * オプションサービス契約<ISP>開始の副次処理（サブオプションサービス契約開始）を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void updateStart(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 条件判定
		if (!isShosaCncValid(inCBSMsg, inContext, inCBSMsg.getString(EKK0361C040CBSMsg.OP_SVC_KEI_NO)))
		{
			return;
		}

		// オプションサービス契約番号に紐付く、
		// メールウィルスチェックのサブオプションサービス契約の取得を行う
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0361C040CBSMsg.OP_SVC_KEI_NO));

		CAANMsg[] retMsgKK0401 = getSbopKeiOfOpKei(inCBSMsg, inContext, inETMsgKK0351);

		// 取得されたサブオプションサービス契約の副次処理を行う
		for (CAANMsg msgKK0401 : retMsgKK0401)
		{
			// サブオプションサービス契約ステータスが"030"(締結済)以外の場合は対象としない
			if (!SBOPSTAT_CONCLUDE.equals(msgKK0401.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT)))
			{
				continue;
			}

			String opSvcKeiNo = msgKK0401.getString(KK0401ETMsg.OP_SVC_KEI_NO);
			String sbopSvcKeiNo = msgKK0401.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);
			String skjYkgt = inCBSMsg.getString(EKK0361C040CBSMsg.SKJ_YKGT);

			// サブオプションサービス契約ETDA生成
			JKKejbKK0401ETDA sbopEtda = new JKKejbKK0401ETDA();

			// 開始日設定(サブオプションサービス)相関ルール
			String staYmd = sbopEtda.execSokanOfStaYmd(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo, skjYkgt);

			if (null == staYmd)
			{
				// 開始日を取得しなかった場合、関連チェックエラー
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SBOP_START_DECIDED_ERR);
				return;
			}

			// 課金開始日設定(オプション)相関ルール
			String chrgStaYmd = sbopEtda.execSokanOfChrgStaYmd(inCBSMsg, inContext, opSvcKeiNo,
																sbopSvcKeiNo, skjYkgt, staYmd);

			if (null == chrgStaYmd)
			{
				// 課金開始日を取得しなかった場合、関連チェックエラー
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SBOP_START_DECIDED_ERR);
				return;
			}

			// カレントレコードの世代を控えておく
			String strGeneCur = msgKK0401.getString(KK0401ETMsg.GENE_ADD_DTM);

			// 登録内容個別項目設定
			setKK0401OfOpStat(inCBSMsg, inContext, msgKK0401, staYmd, chrgStaYmd);

			// サブオプションサービス契約登録
			createKK0401(msgKK0401);

			// サブオプションサービス契約<ISP>開始
			new JKKejbKK0411SecProc().createStat(inCBSMsg, inContext, msgKK0401, strGeneCur);
		}
	}
	
	/**
	 * <p>
	 * オプションサービス契約<ISP>開始の副次処理（異動予約への振舞い）を行う場合の条件判定と、更新データの取得を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 異動予約への振舞いを行うための、対象サブオプションサービス契約のデータ。該当データが存在しない場合はnull。
	 */
	public CAANMsg[] getStartIdoDiv(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 条件判定
		if (!isShosaCncValid(inCBSMsg, inContext, inCBSMsg.getString(EKK0361C040CBSMsg.OP_SVC_KEI_NO)))
		{
			return null;
		}

		// オプションサービス契約番号に紐付く、
		// メールウィルスチェックのサブオプションサービス契約の取得を行う
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0361C040CBSMsg.OP_SVC_KEI_NO));

		return getSbopKeiOfOpKei(inCBSMsg, inContext, inETMsgKK0351);
	}
	
	/**
	 * <p>
	 * メールウィルスチェック登録の条件判定(オプションサービス契約<ISP>登録)を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 割引サービス契約が"ファミリーパック"の場合true、それ以外の場合falseを返却
	 */
	private boolean isInsCondOfOp(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 異動区分がオプション引継または住所変更・登録の場合は処理しない
		if (IDO_DIV_OP_HKTG.equals(inCBSMsg.getString(EKK0361D010CBSMsg.IDO_DIV))
				|| JKKModelConst.IDO_DIV_ADCHG_ADD.equals(inCBSMsg.getString(EKK0361D010CBSMsg.IDO_DIV)))
		{
			return false;
		}
		// サービス契約番号に紐付く割引対象サービス契約を取得
		String svcKeiNo = inCBSMsg.getString(EKK0361D010CBSMsg.SVC_KEI_NO);

		if (null == svcKeiNo)
		{
			// サービス契約番号が設定されていない場合、falseを返却
			return false;
		}
		
		String opSvcCd = inCBSMsg.getString(EKK0361D010CBSMsg.OP_SVC_CD);
		if (!OPCD_EMAIL.equals(opSvcCd))
		{
			// 登録するオプションサービス契約が"Eメール"以外の場合、falseを返却
			return false;
		}

		CAANMsg kk0481Cond = new CAANMsg(KK0481ETMsg.class.getName());
		kk0481Cond.set(KK0481ETMsg.SVC_KEI_NO, svcKeiNo);
		kk0481Cond.set(KK0481ETMsg.MK_FLG, MKFLG_VALID);

		CAANMsg[] kk0481List = null;
		
		try
		{
			kk0481List = new KK0481LE().findByCondition(kk0481Cond);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		for (CAANMsg kk0481Msg : kk0481List)
		{
			HashMap<String, String> hm = new HashMap<String, String>();
			String wribSvcKeiNo = kk0481Msg.getString(KK0481ETMsg.WRIB_SVC_KEI_NO);
			
			if (!hm.containsKey(wribSvcKeiNo))
			{
				// 集約されていない割引サービス契約番号の場合、ハッシュマップにその番号を設定し後続処理を行う
				hm.put(wribSvcKeiNo, null);
				CAANMsg kk0451CurCond = new CAANMsg(KK0451ETMsg.class.getName());
				kk0451CurCond.set(KK0451ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
				kk0451CurCond.set(KK0451ETMsg.RSV_APLY_YMD, opeDate);
				
				// 割引サービス契約番号でカレントレコード検索
				CAANMsg kk0451Cur = new JKKejbKK0451DBABase().findByCurrent(kk0451CurCond);
				
				// 割引サービス契約のカレント取得結果から「解約済」「キャンセル済」を除外する
				if (kk0451Cur != null)
				{
					kk0451Cur = new JKKejbKK0451DBABase().getKK0451OutDsLCl(kk0451Cur);
				}

				if (null == kk0451Cur)
				{
					// カレントレコードが見つからない場合、処理をスキップする
					continue;
				}
				
				String wribSvcCd = kk0451Cur.getString(KK0451ETMsg.WRIB_SVC_CD);
				//ANK-3149-20-00 MOD START
				//if (WRIBCD_FAMILYPACK.equals(wribSvcCd))
				// 割引サービスコードが"ファミリーパック"または"セキュリティーパック"または"プレミアムパック"の割引サービス契約がいる場合、trueを返却
				if (WRIBCD_FAMILYPACK.equals(wribSvcCd) || JKKStrConst.WRIB_SVC_CD_SECURITY_PACK.equals(wribSvcCd) || JKKStrConst.WRIB_SVC_SMARTLINK_PREMIUM.equals(wribSvcCd))
				//ANK-3149-20-00 MOD END
				{
					// 割引サービスコードが"ファミリーパック"の割引サービス契約がいる場合、trueを返却
					return true;
				}
			}
		}
		
		return false;
	}

	/**
	 * <p>
	 * サブオプションサービス契約照査締結・開始の条件判定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo 対象のオプションサービス契約番号
	 * @return フロントからの呼び出しで、オプションサービス契約番号に紐付く、"メールウィルスチェック"のサブオプションサービス契約が存在し、
	 *          かつ"ファミリーパック割引"の割引サービス契約が存在する場合はtrue。存在しない場合はfalse。
	 */
	private boolean isShosaCncValid(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		// フロントからの呼び出し以外の場合は処理を行わない。
		if (!JKKejbCallTypeChecker.isCallTypeFront(inContext))
		{
			return false;
		}

		// オプションサービス契約番号に紐付く、
		// メールウィルスチェックのサブオプションサービス契約の取得を行う
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);

		CAANMsg[] retMsgKK0401 = getSbopKeiOfOpKei(inCBSMsg, inContext, inETMsgKK0351);

		// 対象のレコードが存在しない場合はfalseを返却する
		if (1 > retMsgKK0401.length) 
		{
			return false;
		}

		// 対象のオプションサービス契約番号のカレントレコードを取得する
		CAANMsg curKK0351 = getCurrentKK0351(inCBSMsg, inContext, inCBSMsg.getString(EKK0361C030CBSMsg.OP_SVC_KEI_NO));

		// サービス契約番号に紐付く、割引サービス対象契約のレコードを取得
		CAANMsg kk0481Cond = new CAANMsg(KK0481ETMsg.class.getName());
		kk0481Cond.set(KK0481ETMsg.SVC_KEI_NO, curKK0351.getString(KK0351ETMsg.SVC_KEI_NO));
		kk0481Cond.set(KK0481ETMsg.MK_FLG, MKFLG_VALID);

		CAANMsg[] kk0481List = null;

		try
		{
			kk0481List = new KK0481LE().findByCondition(kk0481Cond);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// 割引サービス対象契約の全件検索結果をもとに、カレントレコードの取得を行います
		CAANMsg[] kk0481CurList = getCurrentAllKK0481(inCBSMsg, inContext, kk0481List);

		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		// 割引サービス対象契約に紐付く、"ファミリーパック割引"の割引サービス契約を取得する
		for (CAANMsg kk0481Msg : kk0481CurList)
		{
			HashMap<String, String> hm = new HashMap<String, String>();
			String wribSvcKeiNo = kk0481Msg.getString(KK0481ETMsg.WRIB_SVC_KEI_NO);

			if (!hm.containsKey(wribSvcKeiNo))
			{
				// 集約されていない割引サービス契約番号の場合、ハッシュマップにその番号を設定し後続処理を行う
				hm.put(wribSvcKeiNo, null);
				CAANMsg kk0451CurCond = new CAANMsg(KK0451ETMsg.class.getName());
				kk0451CurCond.set(KK0451ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
				kk0451CurCond.set(KK0451ETMsg.RSV_APLY_YMD, opeDate);

				// 割引サービス契約番号でカレントレコード検索
				CAANMsg kk0451Cur = new JKKejbKK0451DBABase().findByCurrent(kk0451CurCond);

				if (null == kk0451Cur)
				{
					// カレントレコードが見つからない場合、処理をスキップする
					continue;
				}

				// 割引サービスコードが"ファミリーパック"の割引サービス契約がいる場合、trueを返却
				// OM-2017-0000816 MOD STAR
				//if (WRIBCD_FAMILYPACK.equals(kk0451Cur.getString(KK0451ETMsg.WRIB_SVC_CD)))
				// 割引サービスコードが"ファミリーパック"または"セキュリティーパック"または"プレミアムパック"の割引サービス契約がいる場合、trueを返却
				if (WRIBCD_FAMILYPACK.equals(kk0451Cur.getString(KK0451ETMsg.WRIB_SVC_CD))
						|| JKKStrConst.WRIB_SVC_CD_SECURITY_PACK.equals(kk0451Cur.getString(KK0451ETMsg.WRIB_SVC_CD))
						|| JKKStrConst.WRIB_SVC_SMARTLINK_PREMIUM.equals(kk0451Cur.getString(KK0451ETMsg.WRIB_SVC_CD)))
				// OM-2017-0000816 MOD END
				{
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * <p>
	 * メールウィルスチェック登録の共通条件判定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return 割引サービス契約に紐づくＥメール契約件数がファミリーパックＥメール適用数未満の場合true、
	 * 			それ以外の場合falseを返却
	 */
	private boolean isProperCommonCond(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		if (null == svcKeiNo)
		{
			// サービス契約番号が設定されていない場合、falseを返却
			return false;
		}
		
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		CAANMsg kk0081CurCond = new CAANMsg(KK0081ETMsg.class.getName());
		kk0081CurCond.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		kk0081CurCond.set(KK0081ETMsg.RSV_APLY_YMD, opeDate);
		
		CAANMsg kk0081Cur = new JKKejbKK0081DBABase().findByCurrent(kk0081CurCond);
		if (null == kk0081Cur)
		{
			// サービス契約のカレントレコードが存在しない場合、falseを返却
			return false;
		}
		
		String prcGrpCd = kk0081Cur.getString(KK0081ETMsg.PRC_GRP_CD);

		// サービス契約の料金グループコードを判定
		if (PRCGRPCD_HOME.equals(prcGrpCd))
		{
			// ホームタイプの場合
			maxValue = getWorkParamSetteValue(WORKID_MAX_HOME);
		}
		else if (PRCGRPCD_MEZON.equals(prcGrpCd))
		{
			// メゾンタイプの場合
			maxValue = getWorkParamSetteValue(WORKID_MAX_MEZON);
		}
		else if (PRCGRPCD_MANS.equals(prcGrpCd))
		{
			// マンションタイプの場合
			maxValue = getWorkParamSetteValue(WORKID_MAX_MANS);
		}
		else
		{
			// 料金グループコードが対象外の場合、falseを返却
			return false;
		}
		
		// 上限値との比較用に、キャンセル済と解約済以外のサービス契約番号に紐付くオプションサービス契約を取得
		CAANMsg[] kk0351List = getTargetOpKei(inCBSMsg, inContext, 
								getOpKeiOfSvcKei(inCBSMsg, inContext, svcKeiNo));
		
		// 上記のオプションサービス契約に紐付くメールウィルスチェックのサブオプションサービス契約をカウント
		int cnt = 0;
		for (CAANMsg kk0351Msg : kk0351List)
		{
			cnt += getSbopKeiOfOpKei(inCBSMsg, inContext, kk0351Msg).length;
		}
		
		if (cnt >= maxValue)
		{
			// 割引サービス契約に紐づくＥメール契約件数がファミリーパックＥメール適用数以上の場合、falseを返却
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * オプションサービス契約番号に紐付くオプションサービスのカレントレコード取得を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約番号に紐付くオプションサービスのカレントレコードのリスト
	 */
	private CAANMsg getCurrentKK0351(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		// カレント検索用のメッセージを作成する
		CAANMsg msgkk0351 = new CAANMsg(KK0351ETMsg.class.getName());
		msgkk0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		msgkk0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// オプションサービス契約番号でカレントレコード検索
		CAANMsg retKK0351 = new JKKejbKK0351DBABase().findByCurrent(msgkk0351);

		return retKK0351;
	}
	
	/**
	 * <p>
	 * 業務パラメータマスタの照会を行います(返却値の型:int)。
	 * </p>
	 * @param workParamId　業務パラメータID
	 * @return 業務パラメータ設定値(該当レコードがない場合、0を返却)
	 */
	private int getWorkParamSetteValue(String workParamId)
	{
		CAANMsg zm0321Cond = new CAANMsg(ZM0321ETMsg.class.getName());
		zm0321Cond.set(ZM0321ETMsg.WORK_PARAM_ID, workParamId);
		
		CAANMsg zm0321Msg = new ZM0321LE().findByPrimaryKey(zm0321Cond);
		
		if (null == zm0321Msg)
		{
			// 該当レコードがない場合、0を返却
			return 0;
		}
		
		// 業務パラメータ設定値を返却
		return Integer.parseInt(zm0321Msg.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE));
	}

	/**
	 * <p>
	 * サービス契約番号に紐付くオプションサービスのカレントレコード取得を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約番号に紐付くオプションサービスのカレントレコードのリスト
	 */
	private CAANMsg[] getOpKeiOfSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// サービス契約番号をキーにオプションサービス契約を検索
		CAANMsg kk0351Cond = new CAANMsg(KK0351ETMsg.class.getName());
		kk0351Cond.set(KK0351ETMsg.SVC_KEI_NO, svcKeiNo);
		kk0351Cond.set(KK0351ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] kk0351List = null;
		
		try
		{
			kk0351List = new KK0351LE().findByCondition(kk0351Cond);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		ArrayList<CAANMsg> al = new ArrayList<CAANMsg>();
		HashMap<String, String> hm = new HashMap<String, String>();
		
		for (CAANMsg kk0351Msg : kk0351List)
		{
			
			String opSvcKeiNo = kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
			
			if (!hm.containsKey(opSvcKeiNo))
			{
				// 集約されていないオプションサービス契約番号の場合、ハッシュマップにその番号を設定し後続処理を行う
				hm.put(opSvcKeiNo, null);
				CAANMsg kk0351CurCond = new CAANMsg(KK0351ETMsg.class.getName());
				kk0351CurCond.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
				kk0351CurCond.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);
				
				// オプションサービス契約番号でカレントレコード検索
				CAANMsg kk0351Cur = new JKKejbKK0351DBABase().findByCurrent(kk0351CurCond);

				if (null != kk0351Cur)
				{
					al.add(kk0351Cur);
				}
			}
		}
		
		return al.toArray(new CAANMsg[0]);
	}
	
	/**
	 * <p>
	 * オプションサービス契約のカレントレコードリストのうち以下のレコードの取得を行います。
	 * <li>オプションサービスがEメール</li>
	 * <li>ステータスがキャンセル済、解約済以外</li>
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0351List オプションサービス契約のリスト
	 * @return キャンセル済、解約済以外のオプションサービス契約のレコードリスト
	 */
	private CAANMsg[] getTargetOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg[] kk0351List)
	{
		String opCd = null;
		String opStat = null;
		ArrayList<CAANMsg> al = new ArrayList<CAANMsg>();
		for (CAANMsg kk0351Msg : kk0351List)
		{
			opCd = kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD);
			if (!OPCD_EMAIL.equals(opCd))
			{
				// オプションサービス契約のオプションサービスコードがEメール以外の場合、処理をスキップする
				continue;
			}

			opStat = kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_STAT);
			if (OPSTAT_CANCELED.equals(opStat)
					|| OPSTAT_DISSOLVED.equals(opStat))
			{
				// オプションサービス契約のステータスがキャンセル済または解約済の場合、処理をスキップする
				continue;
			}
			
			al.add(kk0351Msg);
		}

		return al.toArray(new CAANMsg[0]);
	}
	
	/**
	 * <p>
	 * オプションサービスに紐付くサブオプションサービスのカレントレコードのうち、
	 * メールウィルスチェックのサブオプションサービス契約の取得を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0351Msg オプションサービス契約
	 * @return オプションサービス契約に紐付くサブオプションサービス契約のカレントレコードのうち、
	 * 			メールウィルスチェックのサブオプションサービス契約のリスト
	 */
	private CAANMsg[] getSbopKeiOfOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0351Msg)
	{
		ArrayList<CAANMsg> al = new ArrayList<CAANMsg>();
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		String opSvcKeiNo = kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
		
		// オプションサービス契約番号をキーにサブオプションサービス契約を検索
		CAANMsg kk0401Cond = new CAANMsg(KK0351ETMsg.class.getName());
		kk0401Cond.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		kk0401Cond.set(KK0401ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] kk0401List = null;
		
		try
		{
			kk0401List = new KK0401LE().findByCondition(kk0401Cond);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		HashMap<String, String> hm = new HashMap<String, String>();

		for (CAANMsg kk0401Msg : kk0401List)
		{
			String sbopSvcKeiNo = kk0401Msg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);
			
			if (!hm.containsKey(sbopSvcKeiNo))
			{
				// 集約されていないサブオプションサービス契約番号の場合、ハッシュマップにその番号を設定し後続処理を行う
				hm.put(sbopSvcKeiNo, null);
				CAANMsg kk0401CurCond = new CAANMsg(KK0401ETMsg.class.getName());
				kk0401CurCond.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
				kk0401CurCond.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
				kk0401CurCond.set(KK0401ETMsg.RSV_APLY_YMD, opeDate);
				
				// サブオプションサービス契約をカレントレコード検索
				CAANMsg kk0401Cur = new JKKejbKK0401DBABase().findByCurrent(kk0401CurCond);
				
				if (null == kk0401Cur)
				{
					// カレントレコードがない場合、処理をスキップする
					continue;
				}
				
				// サブオプションサービス契約のカレントレコードのステータスが
				// "910"(解約済)、"920"(キャンセル済)の場合、処理をスキップする
				if (SBOPSTAT_DISSOLVED.equals(kk0401Cur.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT))
					|| SBOPSTAT_CANCELED.equals(kk0401Cur.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT)))
				{
					continue;
				}
				
				String sbopSvcCd = kk0401Cur.getString(KK0401ETMsg.SBOP_SVC_CD);
				if (!SBOPCD_VIRUSCHK.equals(sbopSvcCd))
				{
					// サブオプションサービスコードが「メールウィルスチェック」以外の場合、処理をスキップする
					continue;
				}

				// メールウィルスチェックのサブオプションサービス契約をリストに追加
				al.add(kk0401Cur);
			}
		}
		
		return al.toArray(new CAANMsg[0]);
	}
	
	/**
	 * <p>
	 * 割引サービス対象契約の全件検索のリストを元に、カレントレコードの取得を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0481MsgList オプションサービス契約
	 * @return 割引サービス対象契約のカレントレコード配列
	*/
	private CAANMsg[] getCurrentAllKK0481(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg[] kk0481MsgList)
	{
		// 結果返却用リスト
		ArrayList<CAANMsg> array = new ArrayList<CAANMsg>();

		HashMap<String, String> hash = new HashMap<String, String>();

		for (CAANMsg kk0481Msg : kk0481MsgList)
		{
			String wribSvcKeiNo = kk0481Msg.getString(KK0481ETMsg.WRIB_SVC_KEI_NO);
			String wribTaiKeiNo = kk0481Msg.getString(KK0481ETMsg.WRIB_SVC_TRGT_KEI_NO);

			String mapKey = wribSvcKeiNo.concat(wribTaiKeiNo);

			// 集約されていないPK項目の場合、ハッシュマップにその番号を設定し後続処理を行う
			if (!hash.containsKey(mapKey))
			{
				hash.put(mapKey, mapKey);
				CAANMsg kk0481CurCond = new CAANMsg(KK0481ETMsg.class.getName());
				kk0481CurCond.set(KK0481ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
				kk0481CurCond.set(KK0481ETMsg.WRIB_SVC_TRGT_KEI_NO, wribTaiKeiNo);

				// 割引サービス対象契約をカレントレコード検索
				CAANMsg kk0481Cur = new JKKejbKK0481DBABase().findByCurrent(kk0481CurCond);

				// カレントレコードがない場合、次のレコードへ
				if (null == kk0481Cur)
				{
					continue;
				}

				// 適用開始日が未来日の場合、次のレコードへ（適用が開始されていない）
				if (JKKModelCommon.isFutureDateKRCK(inCBSMsg, inContext, kk0481Cur.getString(KK0481ETMsg.WRISVC_TG_KEI_TSTAYMD), "0"))
				{
					continue;
				}

				// 適用終了日が過去日の場合、次のレコードへ（適用が終了している）
				if (JKKModelCommon.isPastDateKRCK(inCBSMsg, inContext, kk0481Cur.getString(KK0481ETMsg.WRISVC_TG_KEI_TENDYMD), "0"))
				{
					continue;
				}

				// 条件に一致するカレントレコードを保持する
				array.add(kk0481Cur);
			}
		}

		return array.toArray(new CAANMsg[0]);
	}
	
	/**
	 * <p>
	 * メールウィルスチェック登録の共通項目設定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Info 共通項目を設定するサブオプションサービス契約ETメッセージ
	 */
	private void setCommonItemMailVirusChk(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Info)
	{
		kk0401Info.set(KK0401ETMsg.GENE_ADD_DTM, JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		kk0401Info.set(KK0401ETMsg.SBOP_SVC_CD, SBOPCD_VIRUSCHK);
		kk0401Info.set(KK0401ETMsg.PCRS_CD, PCRSCD_VIRUSCHK);
		kk0401Info.set(KK0401ETMsg.PPLAN_CD, PPLANCD_VIRUSCHK_FIXED);
		kk0401Info.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		kk0401Info.set(KK0401ETMsg.RSV_APLY_CD, RSVCD_DECIDED);
		kk0401Info.set(KK0401ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0401Info.set(KK0401ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0401Info.set(KK0401ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0401Info.set(KK0401ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0401Info.set(KK0401ETMsg.MK_FLG, MKFLG_VALID);
	}
	

	
	/**
	 * <p>
	 * サブオプションサービス契約の登録内容(オプションサービス<ISP>契約登録)の設定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Info 個別項目を設定するサブオプションサービス契約ETメッセージ
	 */
	private void setKK0401OfOp(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Info)
	{
		kk0401Info.set(KK0401ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0361D010CBSMsg.OP_SVC_KEI_NO));
		kk0401Info.set(KK0401ETMsg.SBOP_SVC_KEI_NO, JKKModelCommon.getSbopSvcKeiNo0401(inCBSMsg, inContext));
		kk0401Info.set(KK0401ETMsg.SBOP_SVC_KEI_STAT, SBOPSTAT_ACCEPTED);
		kk0401Info.set(KK0401ETMsg.MSKM_DTL_NO, inCBSMsg.getString(EKK0361D010CBSMsg.MSKM_DTL_NO));
		kk0401Info.set(KK0401ETMsg.FTRIAL_KANYU_YMD, inCBSMsg.getString(EKK0361D010CBSMsg.FTRIAL_KANYU_YMD));
		kk0401Info.set(KK0401ETMsg.FTRIAL_PRD_ENDYMD, inCBSMsg.getString(EKK0361D010CBSMsg.FTRIAL_PRD_ENDYMD));
		kk0401Info.set(KK0401ETMsg.HONKANYU_YMD, inCBSMsg.getString(EKK0361D010CBSMsg.HONKANYU_YMD));
		kk0401Info.set(KK0401ETMsg.HONKANYU_IKO_KIGEN_YMD, inCBSMsg.getString(EKK0361D010CBSMsg.HONKANYU_IKO_KIGEN_YMD));
		kk0401Info.set(KK0401ETMsg.SVC_USE_STA_KIBO_YMD, inCBSMsg.getString(EKK0361D010CBSMsg.SVC_USE_STA_KIBO_YMD));
		kk0401Info.set(KK0401ETMsg.RSV_TSTA_KIBO_YMD, inCBSMsg.getString(EKK0361D010CBSMsg.RSV_TSTA_KIBO_YMD));
		kk0401Info.set(KK0401ETMsg.PNLTY_HASSEI_CD, inCBSMsg.getString(EKK0361D010CBSMsg.PNLTY_HASSEI_CD));
		kk0401Info.set(KK0401ETMsg.IDO_DIV, inCBSMsg.getString(EKK0361D010CBSMsg.IDO_DIV));
	}
	
	/**
	 * <p>
	 * サブオプションサービス契約の登録内容(オプションサービス契約<ISP>照査締結)の設定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Info 設定するサブオプションサービス契約ETメッセージ
	 */
	private void setKK0401OfOpShosaCnc(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Info)
	{
		kk0401Info.set(KK0401ETMsg.GENE_ADD_DTM, JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		kk0401Info.set(KK0401ETMsg.SBOP_SVC_KEI_STAT, SBOPSTAT_CONCLUDE);
		kk0401Info.set(KK0401ETMsg.SHOSA_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		kk0401Info.setNull(KK0401ETMsg.SHOSA_CL_YMD);
		kk0401Info.set(KK0401ETMsg.KEI_CNC_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		kk0401Info.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		kk0401Info.set(KK0401ETMsg.RSV_APLY_CD, RSVCD_DECIDED);
		kk0401Info.set(KK0401ETMsg.IDO_DIV, inCBSMsg.getString(EKK0361C030CBSMsg.IDO_DIV));
		kk0401Info.set(KK0401ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0401Info.set(KK0401ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0401Info.set(KK0401ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0401Info.set(KK0401ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0401Info.set(KK0401ETMsg.MK_FLG, MKFLG_VALID);
	}

	/**
	 * <p>
	 * サブオプションサービス契約の登録内容(オプションサービス契約<ISP>開始)の設定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Info 設定するサブオプションサービス契約ETメッセージ
	 * @param staYmd 開始年月日
	 * @param chrgStaYmd 課金開始年月日
	 */
	private void setKK0401OfOpStat(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Info, String staYmd, String chrgStaYmd)
	{
		kk0401Info.set(KK0401ETMsg.GENE_ADD_DTM, JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		kk0401Info.set(KK0401ETMsg.SBOP_SVC_KEI_STAT, SBOPSTAT_TEIKYO);
		String opedate = JKKModelCommon.getOpeDate(inCBSMsg);
		// 運用日 ＞ サービス開始年月日の場合
		if (JPCUtilCommon.isPastDate(staYmd, opedate, "0"))
		{
			kk0401Info.set(KK0401ETMsg.RSV_APLY_YMD, opedate);
		}
		else
		{
			kk0401Info.set(KK0401ETMsg.RSV_APLY_YMD, staYmd);
		}
		kk0401Info.set(KK0401ETMsg.RSV_APLY_CD, RSVCD_DECIDED);
		kk0401Info.set(KK0401ETMsg.PLAN_STAYMD, staYmd);
		kk0401Info.set(KK0401ETMsg.PLAN_ENDYMD, FINAL_YMD);
		kk0401Info.set(KK0401ETMsg.PLAN_CHRG_STAYMD, chrgStaYmd);
		kk0401Info.set(KK0401ETMsg.PLAN_CHRG_ENDYMD, FINAL_YMD);
		kk0401Info.set(KK0401ETMsg.SVC_STAYMD, staYmd);
		kk0401Info.set(KK0401ETMsg.SVC_CHRG_STAYMD, chrgStaYmd);
		kk0401Info.set(KK0401ETMsg.SVC_ENDYMD, FINAL_YMD);
		kk0401Info.set(KK0401ETMsg.SVC_CHRG_ENDYMD, FINAL_YMD);
		kk0401Info.set(KK0401ETMsg.IDO_DIV, inCBSMsg.getString(EKK0361C040CBSMsg.IDO_DIV));
		kk0401Info.set(KK0401ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0401Info.set(KK0401ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0401Info.set(KK0401ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0401Info.set(KK0401ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0401Info.set(KK0401ETMsg.MK_FLG, MKFLG_VALID);
	}
	/**
	 * <p>
	 * サブオプションサービス契約の登録を行います。
	 * </p>
	 * @param inETMsg　サブオプションサービス契約のメッセージキャリア
	 */
	private void createKK0401(CAANMsg inETMsg)
	{
		try
		{
			super.create(inETMsg);
		}
		catch (CAANCreateException ce)
		{
			throw new CAANRuntimeException(ce);
		}
	}

	/**
	 * <p>
	 * 登録内容を用いてサブオプションサービス契約明細(オプションサービス契約<ISP>登録)の出力項目を設定します。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param kk0401Info サブオプションサービス契約の登録内容ETメッセージ
	 */
	private void setOutItemOfOp(CAANMsg inCBSMsg, CAANMsg kk0401Info)
	{
		inCBSMsg.set(EKK0361D010CBSMsg.SBOP_SVC_KEI_NO, kk0401Info.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		inCBSMsg.set(EKK0361D010CBSMsg.KK0401_GENE_ADD_DTM, kk0401Info.getString(KK0401ETMsg.GENE_ADD_DTM));
		inCBSMsg.set(EKK0361D010CBSMsg.KK0401_UPD_DTM, kk0401Info.getString(KK0401ETMsg.UPD_DTM));
	}

	/**
	 * <p>
	 * 指定されたサブオプションサービス契約番号に紐付く予約の取消、および自動予約取消ワークの登録を行います。
	 * </p>
	 * @param sbopSvcKeiNo 取り消し対象のサブオプションサービス契約番号
	 * @param idoDiv 異動区分
	 * @param mskmDtlNo 申込明細番号
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 * @param autoRsvClStatCd 自動予約取消状態コード("取消済"/"自動予約取消未実施"：予約取消を実施する/しない)
	 */
	public void cancelReserve(String sbopSvcKeiNo, String idoDiv, String mskmDtlNo,
			String opeDate, String updDtm, String updOpeAct, String autoRsvClStatCd)
	{
		// サブオプションサービス契約スキーマの予約取消
		
		// 予約検索用メッセージ作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, opeDate);

		// 予約検索を行う
		CAANMsg[] retMsgList = super.findByReserve(inETMsg);

		// 取得した予約レコードを全て取り消す
		for (CAANMsg retMsg : retMsgList)
		{
			// 自動予約取消状態コードが"取消済"の場合のみ、予約取消実施
			if (JKKModelConst.AUTO_RSV_CL_STAT_CD_CL_ZM.equals(autoRsvClStatCd))
			{
				updateKK0401ClRsv(retMsg, opeDate, updDtm, updOpeAct);
			}
			// 自動予約取消ワークに登録します
			this.createKK2791GymSchema(retMsg, idoDiv, mskmDtlNo, updDtm, updOpeAct, autoRsvClStatCd);
		}

		// 異動予約スキーマの予約取消

		// 予約検索を行う
		List<CAANMsg> retList = new JKKejbIdoRsvAccess().getIdoRsvSbopSvcKeiNo(sbopSvcKeiNo, 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 kk0401EtMsg ETメッセージ
	 * @param idoDiv 異動区分
	 * @param mskmDtlNo 申込明細番号
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 * @param autoRsvClStatCd 自動予約取消状態コード
	 */
	private void createKK2791GymSchema(CAANMsg kk0401EtMsg, 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.setSbop_svc_kei_no(kk0401EtMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		// 予約契機異動区分
		kk2791etda.setRsv_opty_ido_div(kk0401EtMsg.getString(KK0401ETMsg.IDO_DIV));
		// 予約契機申込明細番号
		kk2791etda.setRsv_opty_mskm_dtl_no(kk0401EtMsg.getString(KK0401ETMsg.MSKM_DTL_NO));
		// 予約適用年月日
		kk2791etda.setRsv_aply_ymd(kk0401EtMsg.getString(KK0401ETMsg.RSV_APLY_YMD));
		// 各種スキーマ世代登録年月日時分秒
		kk2791etda.setVari_schma_gene_add_dtm(kk0401EtMsg.getString(KK0401ETMsg.GENE_ADD_DTM));
		// 予約適用コード
		kk2791etda.setRsv_aply_cd(kk0401EtMsg.getString(KK0401ETMsg.RSV_APLY_CD));
		// 登録年月日時分秒
		kk2791etda.setAdd_dtm(updDtm);
		// 登録オペレータアカウント
		kk2791etda.setAdd_opeacnt(updOpeAct);
		// 更新年月日時分秒
		kk2791etda.setUpd_dtm(updDtm);
		// 更新オペレータアカウント
		kk2791etda.setUpd_opeacnt(updOpeAct);

		// 自動予約取消ワークの登録
		kk2791etda.createKK2791(kk0401EtMsg, "KK0401", 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 sbopSvcKeiNo 回復(または解約取消)対象のサブオプションサービス契約番号
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	public void cancelReserveForKaihk(String sbopSvcKeiNo, String opeDate, String updDtm, String updOpeAct)
	{
		// 予約検索を行う
		List<CAANMsg> kk1681MsgList = new JKKejbIdoRsvAccess().getIdoRsvSbopSvcKeiNo(sbopSvcKeiNo, 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);
		}
	}

	/**
	 * 指定されたサブオプションサービス契約番号に紐付く、サブオプションサービス契約スキーマの予約を取り消します。
	 * @param inMsg 予約検索の結果を保持するメッセージキャリア
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	private void updateKK0401ClRsv(CAANMsg inMsg, String opeDate, String updDtm, String updOpeAct)
	{
		// 更新用メッセージ作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());

		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.GENE_ADD_DTM, inMsg.getString(KK0401ETMsg.GENE_ADD_DTM));
		inETMsg.set(KK0401ETMsg.RSV_CL_YMD, opeDate);
		inETMsg.set(KK0401ETMsg.RSV_APLY_CD, RSV_CANCEL);
		inETMsg.set(KK0401ETMsg.UPD_DTM, updDtm);
		inETMsg.set(KK0401ETMsg.UPD_OPEACNT, updOpeAct);

		// 更新を行う
		try
		{
			super.update(inETMsg);
		}
		catch (CAANFinderException cfe)
		{
			throw new CAANRuntimeException(cfe);
		}
	}

	/**
	 * <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;	
	}
	
	/**
	 * <p>
	 * メールウィルスチェック登録を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Info サブオプションサービス契約のメッセージキャリア(ETメッセージ)
	 */
	public void createMailVirusChk(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Info)
	{
		
		// サブオプションサービス契約登録
		createKK0401(kk0401Info);
		
		return;
	}

	/**
	 * <p>
	 * 指定されたサブオプションサービス契約番号に紐付く予約
	 * （該当の「サブオプションサービス契約」レコードのうち、未来日での予約確定レコード）を解約します。
	 * </p>
	 * @param opSvcKeiNo 解約対象のオプションサービス契約番号
	 * @param sbopSvcKeiNo 解約対象のサブオプションサービス契約番号
	 * @param opeDate 運用日付
	 * @param svcEndymd サービス終了年月日
	 * @param svcChrgEndymd サービス課金終了日
	 * @param svcDlreCd サービス解約理由コード
	 * @param svcDlreMemo サービス解約理由メモ
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	public void dslRsvFixRec(String opSvcKeiNo, String sbopSvcKeiNo, String opeDate,
			String svcEndymd, String svcChrgEndymd, String svcDlreCd, String svcDlreMemo,
			String updDtm, String updOpeAct)
	{
		/* ------------------------------------------------------------------------------------------------------------------------
		 * 予約中の強制解約、および住所変更予約中の解約の場合、回復時に予約情報を反映する必要があるため予約取消は行わない。
		 * ※ただし、未来日・予約確定レコードについては、予約適用年月日が到来した時点で、カレントレコードとなってしまうため、
		 *   以下の更新処理を行う。
		 * (1)予約解約(キャンセル)：解約時に予約レコードを"解約済"とする。
		 * (2)予約回復(キャンセル取消)：回復時に予約レコードを元のステータスに回復する。（現時点では、住所変更中の解約／回復に対してのみ実施する。）
		 * ------------------------------------------------------------------------------------------------------------------------ */
		
		// 該当の「サブオプションサービス契約」レコードの予約確定レコードを取得する。
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		inETMsg.set(KK0401ETMsg.RSV_APLY_CD, JKKModelConst.RSV_APLY_CD_RSV_FIX);
		inETMsg.set(KK0401ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

		CAANMsg[] retMsg = null;
		try
		{
			retMsg = new KK0401LE().findByCondition(inETMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// 予約解約実行
		for (int i = 0; i < retMsg.length; i++)
		{
			// 予約適用年月日＞運用日付の予約確定レコードのみ解約する。
			if (JKKModelCommon.isFutureDate(retMsg[i].getString(KK0401ETMsg.RSV_APLY_YMD), opeDate, "0"))
			{
				updateKK0401DslRsv(retMsg[i], svcEndymd, svcChrgEndymd, svcDlreCd, svcDlreMemo,
						updDtm, updOpeAct);
			}
		}
	}

	/**
	 * <p>
	 * 指定されたサブオプションサービス契約番号に紐付く、サブオプションサービス契約スキーマの予約レコードを解約します。
	 * </p>
	 * @param inMsg 予約検索の結果を保持するメッセージキャリア
	 * @param svcEndymd サービス終了年月日
	 * @param svcChrgEndymd サービス課金終了日
	 * @param svcDlreCd サービス解約理由コード
	 * @param svcDlreMemo サービス解約理由メモ
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	private void updateKK0401DslRsv(CAANMsg inMsg,
			String svcEndymd, String svcChrgEndymd, String svcDlreCd, String svcDlreMemo,
			String updDtm, String updOpeAct)
	{
		// 更新用メッセージ作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());

		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.GENE_ADD_DTM, inMsg.getString(KK0401ETMsg.GENE_ADD_DTM));
		// サブオプションサービス契約ステータス
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_STAT, JKKModelConst.SVC_KEI_STAT_DSL_ZM);
		// プラン終了年月日
		inETMsg.set(KK0401ETMsg.PLAN_ENDYMD, svcEndymd);
		// プラン課金終了年月日
		inETMsg.set(KK0401ETMsg.PLAN_CHRG_ENDYMD, svcChrgEndymd);
		// サービス終了年月日
		inETMsg.set(KK0401ETMsg.SVC_ENDYMD, svcEndymd);
		// サービス課金終了年月日
		inETMsg.set(KK0401ETMsg.SVC_CHRG_ENDYMD, svcChrgEndymd);
		// サービス解約年月日
		inETMsg.set(KK0401ETMsg.SVC_DSL_YMD, svcEndymd);
		// サービス解約理由コード
		inETMsg.set(KK0401ETMsg.SVC_DLRE_CD, svcDlreCd);
		// サービス解約理由メモ
		inETMsg.set(KK0401ETMsg.SVC_DLRE_MEMO, svcDlreMemo);
		inETMsg.set(KK0401ETMsg.UPD_DTM, updDtm);
		inETMsg.set(KK0401ETMsg.UPD_OPEACNT, updOpeAct);
		
		// 更新を行う
		try
		{
			super.update(inETMsg);
		}
		catch (CAANFinderException cfe)
		{
			throw new CAANRuntimeException(cfe);
		}
	}
    // OM-2014-0002482 ADD START
	/**
	 * <p>
	 * オプションサービス契約<ISP>照査の副次処理（サブオプションサービス契約照査）を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void subOpSvKeiPause(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 条件判定
		if (!isShosaCncValid(inCBSMsg, inContext, inCBSMsg.getString(EKK0361C010CBSMsg.OP_SVC_KEI_NO)))
		{
			return;
		}

		// オプションサービス契約番号に紐付く、
		// メールウィルスチェックのサブオプションサービス契約の取得を行う
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0361C010CBSMsg.OP_SVC_KEI_NO));

		CAANMsg[] retMsgKK0401 = getSbopKeiOfOpKei(inCBSMsg, inContext, inETMsgKK0351);

		// 取得されたサブオプションサービス契約の副次処理を行う
		for (CAANMsg msgKK0401 : retMsgKK0401)
		{
			// サブオプションサービス契約ステータスが"010"(受付済)以外の場合は対象としない
			if (!SBOPSTAT_ACCEPTED.equals(msgKK0401.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT)))
			{
				continue;
			}

			// カレントレコードの世代を控えておく
			String strGeneCur = msgKK0401.getString(KK0401ETMsg.GENE_ADD_DTM);
	
			// 登録内容個別項目設定
			setKK0401OfOpShosa(inCBSMsg, inContext, msgKK0401);

			// サブオプションサービス契約登録
			createKK0401(msgKK0401);

			// サブオプションサービス契約<ISP>照査締結
			new JKKejbKK0411SecProc().createShosaCnc(inCBSMsg, inContext, msgKK0401, strGeneCur);
		}
	}
    // OM-2014-0002482 ADD END
	// OM-2014-0002482 ADD START
	/**
	 * <p>
	 * サブオプションサービス契約の登録内容(オプションサービス契約<ISP>照査)の設定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Info 設定するサブオプションサービス契約ETメッセージ
	 */
	private void setKK0401OfOpShosa(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Info)
	{
	
		kk0401Info.set(KK0401ETMsg.GENE_ADD_DTM, (String)JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		kk0401Info.set(KK0401ETMsg.SBOP_SVC_KEI_STAT, SBOPSTAT_SHOSA);
		kk0401Info.set(KK0401ETMsg.SHOSA_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		kk0401Info.setNull(KK0401ETMsg.SHOSA_CL_YMD);
		kk0401Info.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		kk0401Info.set(KK0401ETMsg.RSV_APLY_CD, "2");
		kk0401Info.set(KK0401ETMsg.IDO_DIV, inCBSMsg.getString(EKK0361C010CBSMsg.IDO_DIV));
		kk0401Info.set(KK0401ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0401Info.set(KK0401ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0401Info.set(KK0401ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0401Info.set(KK0401ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0401Info.setNull(KK0401ETMsg.DEL_DTM);
		kk0401Info.setNull(KK0401ETMsg.DEL_OPEACNT);
		kk0401Info.set(KK0401ETMsg.MK_FLG, "0");
	}
	// OM-2014-0002482 ADD END
}
