/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0401ETDA
*   ソースファイル名：JKKejbKK0401ETDA.java
*   作成者          ：富士通
*   日付            ：2011年11月14日
*＜機能概要＞
*   サブオプションサービス契約のDBアクセス部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/11/14  富士通      新規作成
*	v5.00.00	2013/10/30	FJ)小島		OM-2013-0002943
*	v6.00.00	2013/11/29	FJ)大山		IT2-2013-0000830
*	v8.00.00	2014/03/11	FJ)寺園		ANK-1855-00-00
*	v9.00.00	2014/08/05	FJ)小島		OM-2014-0002598
*	v12.00.00	2015/03/03	FJ)川島		OM-2014-0004052
*   v39.00.00   2018/10/01  FJ)舘山		【ANK-3484-00-00】_端末補償サービス導入対応
*	v73.00.00	2024/09/26	FJ)謝		【ANK-4427-00-00】NTT卸対応
*	v75.00.00	2025/05/22	FJ)謝		【#87269】電話サービス（オプション）の開始日が申込日（受付日）基準となる
**********************************************************************/

package eo.ejb.common.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK0011ETMsg;
import eo.ejb.cbm.entity.KK0021ETMsg;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0411ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0081C260CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0411C050CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.entity.JKKejbIdoRsvAccess;
import eo.ejb.common.rule.JKKejbRule0068001;
import eo.ejb.common.rule.JKKejbRule0076001;
import eo.ejb.common.rule.JKKejbRule0083001;
import eo.ejb.common.rule.JKKejbRule0088001;

/**
 * <p>
 * サブオプションサービス契約のDBアクセス部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0401ETDA
{
	
	/** スキーマID サブオプションサービス契約 */
	public static final String SCHEMAID_SBOPSVCKEI = "KK0401";
	
	/** スキーマID 異動予約 */
	public static final String SCHEMAID_IDORSV = "KK1681";
	
	/** エラーフラグ 異動対象スキーマ判定相関ルール */
	public static final String RSLT_CORR_IDORSV = "5";
	
	/** 契約ステータス サービス提供中 */
	private static final String STAT_USING = "100";
	
	/** 予約適用コード 予約確定 */
	private static final String APLYCD_DECIDED = "2";
	
	/** 終了年月日 システム最終年月日 */
	private static final String SYS_LASTYMD = "20991231";
	
	/** 無効フラグ 有効 */
	private static final String MKFLG_VALID = "0";

	/** 異動予約動作いコード オプション開始 */
	private static final String IDO_RSV_DTL_OPSTA = "014";

	/** 親契約識別コード サービス契約内訳 */
	private static final String OYA_KEI_SKBT_SVCKEI_UCWK = "03";

	/** 月初 */
	public static final String GESYO = "01";

	/** 月初設定用 */
	public static final String GESYO_SETTEI = "1";

	/** 月初以外設定用 */
	public static final String GESYO_IGAI_SETTEI = "0";

// ▽▽▽ ANK-3484-00-00 ADD START
	/** 端末補償のサブオプションリスト（現行１つしか存在しないがオプションとロジックを合わせる）*/
	private static final List<String> TMCP_SBOP_SVC_CD_LIST = java.util.Arrays.asList(new String[] {"D12"});
// △△△ ANK-3484-00-00 ADD END
// #87269 ADD START
	/** eo光電話(type N)のサブオプションリスト*/
	private static final List<String> TYPEN_SBOP_SVC_CD_LIST = java.util.Arrays.asList(new String[] {"D13","D14","D15","D16"});
// #87269 ADD END
	
	/**
	 * <p>
	 * 新しいJKKejbKK0401ETDAを作成します。
	 * </p>
	 */
	public JKKejbKK0401ETDA()
	{
	}

	/**
	 * <p>
	 * 「サブオプションサービス契約」のレコードを削除(論理削除)します。
	 * </p>
	 * @param kk0401Msg 削除対象となる「サブオプションサービス契約」履歴世代レコードのメッセージキャリア
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	public void deleteKK0401(CAANMsg kk0401Msg, String updDtm, String updOpeAct)
	{
		// 更新用メッセージ作成
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());

		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, kk0401Msg.getString(KK0401ETMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, kk0401Msg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.GENE_ADD_DTM, kk0401Msg.getString(KK0401ETMsg.GENE_ADD_DTM));
		inETMsg.set(KK0401ETMsg.MK_FLG, JKKModelConst.MK_FLG_MK);
		inETMsg.set(KK0401ETMsg.UPD_DTM, updDtm);
		inETMsg.set(KK0401ETMsg.UPD_OPEACNT, updOpeAct);
		inETMsg.set(KK0401ETMsg.DEL_DTM, updDtm);
		inETMsg.set(KK0401ETMsg.DEL_OPEACNT, updOpeAct);

		// 更新を行う
		new JKKejbDBAUtil(inETMsg).update(inETMsg);

		// サブタイプ更新を行う
		JKKejbKK0401SubTypeDelete instance = new JKKejbKK0401SubTypeDelete(inETMsg);
		instance.setOpSvcKeiNo(kk0401Msg.getString(KK0401ETMsg.OP_SVC_KEI_NO));
		instance.setSbopSvcKeiNo(kk0401Msg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		instance.setGeneAddDtm(kk0401Msg.getString(KK0401ETMsg.GENE_ADD_DTM));
		instance.setAddUpdDelDtm(updDtm);
		instance.setAddUpdDelOpeacnt(updOpeAct);
		instance.deleteSubTypeKK0401();
	}

	/**
	 * <p>
	 * 開始日設定(サブオプションサービス)相関ルールを実行します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo	オプションサービス契約番号
	 * @param sbopSvcKeiNo	サブオプションサービス契約番号
	 * @param skjYkgt	即時/翌月(01:即時、02:翌月)
	 * @return 相関ルールにより取得した開始日
	 */
	public String execSokanOfStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext,
			String opSvcKeiNo, String sbopSvcKeiNo, String skjYkgt)
	{
		// サブオプションサービス契約に紐付くサービス契約のサービスコードを取得
		CAANMsg kk0081Cur = getCurSvcKeiViaOpKei(inCBSMsg, inContext, opSvcKeiNo);
		String curSvcCd = kk0081Cur.getString(KK0081ETMsg.SVC_CD);
		
		// サブオプションサービス契約のサブオプションサービスコードを取得
		CAANMsg kk0401Cur = getCurSbopKei(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo);
		String sbopSvcCd = kk0401Cur.getString(KK0401ETMsg.SBOP_SVC_CD);
		
		// サブオプションサービス契約に紐付くオプションサービス契約のサービス開始年月日を取得
		CAANMsg kk0351Cur = getCurOpKei(inCBSMsg, inContext, opSvcKeiNo);
		String svcStaYmd = kk0351Cur.getString(KK0351ETMsg.SVC_STAYMD);

		// オプションサービス契約が開始していない場合
		if (svcStaYmd == null)
		{
			// オプションサービス契約に紐付く異動予約の取得
			JKKejbIdoRsvAccess instance = new JKKejbIdoRsvAccess();
			List<CAANMsg> list = instance.getIdoRsvOpSvcKeiNo(opSvcKeiNo, JKKModelCommon.getOpeDate(inCBSMsg));

			for (CAANMsg msg : list)
			{
				// 異動予約詳細コードがオプション開始か判定
				if (IDO_RSV_DTL_OPSTA.equals(msg.getString(KK1681ETMsg.IDO_RSV_DTL_CD)))
				{
					// 異動予約の予約適用年月日を設定
					svcStaYmd = msg.getString(KK1681ETMsg.RSV_APLY_YMD);
				}
			}
		}
		
		// サブオプションサービス契約に紐付く申込の申込受付年月日時分秒を取得し、年月日形式に変換
		CAANMsg kk0011Cur = getCurMskmViaSbopKei(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo);
		String mskmUkDtm = kk0011Cur.getString(KK0011ETMsg.MSKM_UK_DTM);
		String mskmUkYmd = JKKModelCommon.toYmdFromDtm(mskmUkDtm);
		
		// サブオプションサービス契約のサービス利用開始希望年月日を取得
		String svcUseStaKiboYmd = kk0401Cur.getString(KK0401ETMsg.SVC_USE_STA_KIBO_YMD);
// #87269 ADD START
		// eo光電話(type N)の場合
		if (TYPEN_SBOP_SVC_CD_LIST.contains(sbopSvcCd))
		{
			if (inCBSMsg.containsKeyOfSchema(EKK0411C050CBSMsg.DSP_SVCTK_STAYMD))
			{
				// サービス利用開始希望年月日に表示用サービス提供開始年月日を設定
				svcUseStaKiboYmd = inCBSMsg.getString(EKK0411C050CBSMsg.DSP_SVCTK_STAYMD);
			}
		}
// #87269 ADD END
		
		// 申込明細の申込年月日を取得
		CAANMsg kk0021Cur = this.getCurMskmDtl(inCBSMsg, inContext, kk0401Cur.getString(KK0401ETMsg.MSKM_DTL_NO));
		String mskmYmd = kk0021Cur.getString(KK0021ETMsg.MSKM_YMD);

		// OM-2014-0002598 MOD START
		// サブオプションサービス契約に紐付くサービス契約のサービス課金開始年月日を取得
        //String svcChrgStaymd = kk0081Cur.getString(KK0081ETMsg.SVC_CHRG_STAYMD);
		
		// サブオプションサービス契約に紐付くサービス契約のサービス開始年月日を取得
        //String rule0088SvcStaYmd = kk0081Cur.getString(KK0081ETMsg.SVC_STA_YMD);
		String rule0088SvcStaYmd = null;
		String svcChrgStaymd = null;
		
		// サービスが電話の場合
		if (JKKModelConst.SVC_CD_TEL.equals(curSvcCd))
		{
			// サービス契約内訳番号に紐付くサービス契約内訳を取得
			CAANMsg kk0161Cur = getCurSvcKeiUcwk(inCBSMsg, inContext, kk0351Cur.getString(KK0351ETMsg.SVC_KEI_UCWK_NO));
			
			// オプションサービス契約に紐付くサービス契約内訳のサービス課金開始年月日を取得
			svcChrgStaymd = kk0161Cur.getString(KK0161ETMsg.SVC_CHRG_STAYMD);
			
			// オプションサービス契約に紐付くサービス契約内訳のサービス開始年月日を取得
			rule0088SvcStaYmd = kk0161Cur.getString(KK0161ETMsg.SVC_STA_YMD);
		}
		else
		{
			// オプションサービス契約に紐付くサービス契約のサービス課金開始年月日を取得
			svcChrgStaymd = kk0081Cur.getString(KK0081ETMsg.SVC_CHRG_STAYMD);
			
			// オプションサービス契約に紐付くサービス契約のサービス開始年月日を取得
			rule0088SvcStaYmd = kk0081Cur.getString(KK0081ETMsg.SVC_STA_YMD);
		}
		// OM-2014-0002598 MOD END
		
		// サービス契約のサービス開始年月日が未設定の場合
		if (rule0088SvcStaYmd == null)
		{
			// 異動予約より予約適用年月日を取得する
			JKKejbIdoRsvAccess jkIdoAc = new JKKejbIdoRsvAccess();
			List<CAANMsg> kk1681IdoList = jkIdoAc.getIdoRsvSvcKeiNo(kk0081Cur.getString(KK0081ETMsg.SVC_KEI_NO), JKKModelCommon.getOpeDate(inCBSMsg));

			for (CAANMsg msg : kk1681IdoList)
			{
				// 異動予約詳細コードがオプション開始か判定
				if (IDO_RSV_DTL_OPSTA.equals(msg.getString(KK1681ETMsg.IDO_RSV_DTL_CD)))
				{
					// 異動予約の予約適用年月日を設定
					rule0088SvcStaYmd = msg.getString(KK1681ETMsg.RSV_APLY_YMD);
				}
			}
		}

		// 申込期間を取得する
		String mskmPeriod = this.getMskmPeriod(inCBSMsg, mskmYmd, rule0088SvcStaYmd, svcChrgStaymd);
		// 申込期間が未設定または期間未定の場合はnullを返却（関連制約エラーとする）
		if (mskmPeriod == null || "0".equals(mskmPeriod))
		{
			return null;
		}
// ▽▽▽ ANK-3484-00-00 ADD START
		// 端末補償の申込年月日を設定
		String tmcpMskmYmd = null;
		if (TMCP_SBOP_SVC_CD_LIST.contains(sbopSvcCd))
		{
			CAANMsg kk0411Cur = getCurSbopKeiIsp(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo);
			tmcpMskmYmd = kk0411Cur.getString(KK0411ETMsg.TMCP_MSKM_YMD);
		}
// △△△ ANK-3484-00-00 ADD END
		
		// 相関ルールのパラメータを設定
		JKKejbRule0076001 rule0076001 = new JKKejbRule0076001(inCBSMsg);
		rule0076001.setSvc_cd(curSvcCd);
		rule0076001.setSbop_svc_cd(sbopSvcCd);
		rule0076001.setMskm_period(mskmPeriod);
		rule0076001.setSkj_ykjt(skjYkgt);
		rule0076001.setKk0351_svc_sta_ymd(svcStaYmd);
		rule0076001.setKk0011_mskm_uk_ymd(mskmUkYmd);
		rule0076001.setSvc_use_sta_kibo_ymd(svcUseStaKiboYmd);
// ▽▽▽ ANK-3484-00-00 ADD START
		rule0076001.setKk0081_svc_chrg_sta_ymd(svcChrgStaymd);
		rule0076001.setTmcp_mskm_ymd(tmcpMskmYmd);
// △△△ ANK-3484-00-00 ADD END
		
		// 開始日設定(オプションサービス)相関ルールを呼出
		String staYmd = rule0076001.getStaYmd();
		
		return staYmd;
	}

// OM-2014-0004052 2015/03/03 ADD START
	/**
	 * <p>
	 * 課金開始日設定(サブオプションサービス)相関ルールを実行します。<br>
	 * (オプション引継以外の場合、こちらを使用する)
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo	オプションサービス契約番号
	 * @param sbopSvcKeiNo	サブオプションサービス契約番号
	 * @param skjYkgt	即時/翌月(01:即時、02:翌月)
	 * @param staYmd	開始日設定(オプションサービス)相関ルールで算出した開始年月日
	 * @return 相関ルールにより取得した課金開始日
	 */
	public String execSokanOfChrgStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext,
											String opSvcKeiNo, String sbopSvcKeiNo, String skjYkgt, String staYmd)
	{
		return execSokanOfChrgStaYmd(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo, skjYkgt, staYmd, null);
	}
// OM-2014-0004052 2015/03/03 ADD END

	/**
	 * <p>
	 * 課金開始日設定(サブオプションサービス)相関ルールを実行します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo	オプションサービス契約番号
	 * @param sbopSvcKeiNo	サブオプションサービス契約番号
	 * @param skjYkgt	即時/翌月(01:即時、02:翌月)
	 * @param staYmd	開始日設定(オプションサービス)相関ルールで算出した開始年月日
	 * @param opHktgiYmd	オプション引継年月日
	 * @return 相関ルールにより取得した課金開始日
	 */
// OM-2014-0004052 2015/03/03 MOD START
//	public String execSokanOfChrgStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext,
//											String opSvcKeiNo, String sbopSvcKeiNo, String skjYkgt, String staYmd)
	public String execSokanOfChrgStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext,
											String opSvcKeiNo, String sbopSvcKeiNo, String skjYkgt, String staYmd, String opHktgiYmd)
// OM-2014-0004052 2015/03/03 MOD END
	{
		// サブオプションサービス契約に紐付くサービス契約のサービスコードを取得
		CAANMsg kk0081Cur = getCurSvcKeiViaOpKei(inCBSMsg, inContext, opSvcKeiNo);
		String curSvcCd = kk0081Cur.getString(KK0081ETMsg.SVC_CD);
		
		// サブオプションサービス契約のカレントレコードを取得
		CAANMsg kk0401Cur = getCurSbopKei(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo);
		// サブオプションサービスコードを取得する
		String sbopSvcCd = kk0401Cur.getString(KK0401ETMsg.SBOP_SVC_CD);
		
		// 申込明細の申込年月日を取得
		CAANMsg kk0021Cur = this.getCurMskmDtl(inCBSMsg, inContext, kk0401Cur.getString(KK0401ETMsg.MSKM_DTL_NO));
		String mskmYmd = kk0021Cur.getString(KK0021ETMsg.MSKM_YMD);

		// OM-2014-0002598 MOD START
		// サブオプションサービス契約に紐付くサービス契約のサービス課金開始年月日を取得
		//String svcChrgStaymd = kk0081Cur.getString(KK0081ETMsg.SVC_CHRG_STAYMD);
		
		// サブオプションサービス契約に紐付くサービス契約のサービス開始年月日を取得
		//String rule0088SvcStaYmd = kk0081Cur.getString(KK0081ETMsg.SVC_STA_YMD);
		
		String svcChrgStaymd = null;
		String rule0088SvcStaYmd = null;
		
		// サービスが電話の場合
		if (JKKModelConst.SVC_CD_TEL.equals(curSvcCd))
		{
			// サービス契約内訳番号に紐付くサービス契約内訳を取得
			CAANMsg kk0351Cur = getCurOpKei(inCBSMsg, inContext, opSvcKeiNo);
			CAANMsg kk0161Cur = getCurSvcKeiUcwk(inCBSMsg, inContext, kk0351Cur.getString(KK0351ETMsg.SVC_KEI_UCWK_NO));
			
			// オプションサービス契約に紐付くサービス契約内訳のサービス課金開始年月日を取得
			svcChrgStaymd = kk0161Cur.getString(KK0161ETMsg.SVC_CHRG_STAYMD);
			
			// オプションサービス契約に紐付くサービス契約内訳のサービス開始年月日を取得
			rule0088SvcStaYmd = kk0161Cur.getString(KK0161ETMsg.SVC_STA_YMD);
		}
		else
		{
			// オプションサービス契約に紐付くサービス契約のサービス課金開始年月日を取得
			svcChrgStaymd = kk0081Cur.getString(KK0081ETMsg.SVC_CHRG_STAYMD);

			// オプションサービス契約に紐付くサービス契約のサービス開始年月日を取得
			rule0088SvcStaYmd = kk0081Cur.getString(KK0081ETMsg.SVC_STA_YMD);
		}
		// OM-2014-0002598 MOD END
		
		// サービス契約のサービス開始年月日が未設定の場合
		if (rule0088SvcStaYmd == null)
		{
			// 異動予約より予約適用年月日を取得する
			JKKejbIdoRsvAccess jkIdoAc = new JKKejbIdoRsvAccess();
			List<CAANMsg> kk1681IdoList = jkIdoAc.getIdoRsvSvcKeiNo(kk0081Cur.getString(KK0081ETMsg.SVC_KEI_NO), JKKModelCommon.getOpeDate(inCBSMsg));

			for (CAANMsg msg : kk1681IdoList)
			{
				// 異動予約詳細コードがオプション開始か判定
				if (IDO_RSV_DTL_OPSTA.equals(msg.getString(KK1681ETMsg.IDO_RSV_DTL_CD)))
				{
					// 異動予約の予約適用年月日を設定
					rule0088SvcStaYmd = msg.getString(KK1681ETMsg.RSV_APLY_YMD);
				}
			}
		}

		// 申込期間を取得する
		String mskmPeriod = this.getMskmPeriod(inCBSMsg, mskmYmd, rule0088SvcStaYmd, svcChrgStaymd);
		// 申込期間が未設定または期間未定の場合はnullを返却（関連制約エラーとする）
		if (mskmPeriod == null || "0".equals(mskmPeriod))
		{
			return null;
		}
		
		// オプションサービス契約に紐付くサービス契約の料金グループを取得
		String prcGrpCd = kk0081Cur.getString(KK0081ETMsg.PRC_GRP_CD);
// OM-2014-0004052 2015/03/03 ADD START
		// オプション引継年月日が設定されている時、課金開始日と比較を行い、
		// 課金開始日 ＜ オプション引継年月日の場合、オプション引継年月日を課金開始日として、
		// RULE0066に連携する。
		String bfSvcChrgStaYmd = svcChrgStaymd;
		if(null != opHktgiYmd && null != bfSvcChrgStaYmd)
		{
			if(bfSvcChrgStaYmd.compareTo(opHktgiYmd) < 0)
			{
				bfSvcChrgStaYmd = opHktgiYmd;
			}
		}
// ▽▽▽ ANK-3484-00-00 ADD START
		// 引継元の課金終了日を取得する。
		// 端末補償では、端末補償契約番号がユニークに設定されるためその情報をキーとして取得する。
		// その他のオプションでは引継元の課金終了日は使わないためnullを設定する
		String prvChrgEndYmd = null;
		if (opHktgiYmd != null && opHktgiYmd.length() > 0 && TMCP_SBOP_SVC_CD_LIST.contains(sbopSvcCd))
		{
			prvChrgEndYmd = getPreviousSvcChrgEnd(kk0401Cur, inContext, opSvcKeiNo, sbopSvcCd);
		}
// △△△ ANK-3484-00-00 ADD END
// OM-2014-0004052 2015/03/03 ADD END
		JKKejbRule0068001 rule0068001 = new JKKejbRule0068001(inCBSMsg);
		rule0068001.setSvc_cd(curSvcCd);
		rule0068001.setIdo_div(inCBSMsg.getString("ido_div")); // 異動区分を設定する
		rule0068001.setUpd_type("1");			// 更新契機(開始時)を設定
		rule0068001.setSbop_svc_cd(sbopSvcCd);	// サブオプションサービスコードを設定		
		rule0068001.setPrc_grp_cd(prcGrpCd);
		rule0068001.setMskm_period(mskmPeriod);
		rule0068001.setSvc_sta_ymd(staYmd);
// OM-2014-0004052 2015/03/03 MOD START
//		rule0068001.setBefor_svc_chrg_sta_ymd(svcChrgStaymd);
		rule0068001.setBefor_svc_chrg_sta_ymd(bfSvcChrgStaYmd);
// OM-2014-0004052 2015/03/03 MOD END
// ▽▽▽ ANK-3484-00-00 ADD START
		rule0068001.setBefor_svc_chrg_end_ymd(prvChrgEndYmd);
// △△△ ANK-3484-00-00 ADD END
		
		// 課金開始日設定(サブオプションサービス)相関ルールを呼出
		String chrgStaYmd = rule0068001.getChrgStaYmd();
		
		return chrgStaYmd;
	}
	
	/**
	 * <p>
	 * 異動対象スキーマ判定相関ルールを実行します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcStaYmd		開始日設定(オプションサービス)相関ルールで算出したサービス開始年月日
	 * @return 異動対象スキーマ判定相関ルール実行結果のリスト
	 */
	public List<HashMap<String, Object>> execSokanOfIdoJdg(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcStaYmd)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		// 相関ルールにて振舞うスキーマを判定
		JKKejbRule0083001 rule0083 = new JKKejbRule0083001(inCBSMsg);
		rule0083.setSvc_if_id(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY));
		rule0083.setBase_date(svcStaYmd);
		rule0083.setOpe_date(opeDate);
		
		List<HashMap<String, Object>> ruleList = rule0083.referRuleEngine();
		
		return ruleList;		
	}
	
	/**
	 * <p>
	 * 異動対象スキーマ判定相関ルールの結果を元に振舞うスキーマを判定します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param ruleList　異動対象スキーマ判定相関ルール実行結果のリスト
	 * @return 振舞対象スキーマ
	 */
	public String judgeSchema(CAANMsg inCBSMsg, AgentDispatchContext inContext, List<HashMap<String, Object>> ruleList)
	{
		String ret = null;
		
		for (HashMap<String, Object> hm : ruleList)
		{
			if (SCHEMAID_SBOPSVCKEI.equals(hm.get(JKKejbRule0083001.TRGT_SCHEMA_ID)))
			{
				ret = SCHEMAID_SBOPSVCKEI;
			}
			if (SCHEMAID_IDORSV.equals(hm.get(JKKejbRule0083001.TRGT_SCHEMA_ID)))
			{
				ret = SCHEMAID_IDORSV; 
			}
		}
		
		return ret;
	}
	
	/**
	 * <p>
	 * サブオプションサービス契約への振舞を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Msg　サブオプションサービス契約のETメッセージ
	 * @param staYmd　開始年月日
	 * @param chrgStaYmd　課金開始年月日
	 * @return サブオプションサービス契約に登録した内容を持ったETメッセージ
	 */
	public CAANMsg execDBAccessSbopKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Msg,
											String staYmd, String chrgStaYmd)
	{
		CAANMsg dbInfo = setInfoOfOpKei(inCBSMsg, inContext, kk0401Msg, staYmd, chrgStaYmd);
		
		createKK0401(inCBSMsg, inContext, dbInfo);

		return dbInfo;
	}

	/**
	 * <p>
	 * 異動予約への振舞を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk1681Msg　異動予約のETメッセージ
	 * @param staYmd　開始年月日
	 * @param chrgStaYmd　課金開始年月日
	 * @param ruleMap 異動対象スキーマ判定相関ルールの結果のマップ
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return 異動予約に登録した内容を持ったETメッセージ
	 */
	public CAANMsg execDBAccessIdoRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk1681Msg,
										String staYmd, String chrgStaYmd, Map<String, Object> ruleMap, String opSvcKeiNo)
	{
		CAANMsg dbInfo = setInfoOfIdoRsv(inCBSMsg, inContext, kk1681Msg, staYmd, chrgStaYmd, ruleMap, opSvcKeiNo);
		
		createKK1681(inCBSMsg, inContext, dbInfo);
		
		return dbInfo;
	}
	
	/**
	 * <p>
	 * 申込明細のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param mskmDtlNo 申込明細番号
	 * @return 申込明細のカレントレコード
	 */
	private CAANMsg getCurMskmDtl(CAANMsg inCBSMsg, AgentDispatchContext inContext, String mskmDtlNo)
	{
		CAANMsg kk0021Cond = new CAANMsg(KK0021ETMsg.class.getName());
		kk0021Cond.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);
		
		return new JKKejbKK0021DBABase().findByCurrent(kk0021Cond);
	}
	
	/**
	 * <p>
	 * 申込のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param mskmNo 申込番号
	 * @return 申込のカレントレコード
	 */
	private CAANMsg getCurMskm(CAANMsg inCBSMsg, AgentDispatchContext inContext, String mskmNo)
	{
		CAANMsg kk0011Cond = new CAANMsg(KK0011ETMsg.class.getName());
		kk0011Cond.set(KK0011ETMsg.MSKM_NO, mskmNo);
		
		return new JKKejbKK0011DBABase().findByCurrent(kk0011Cond);
	}
	
	/**
	 * <p>
	 * サブオプションサービス契約に紐付く申込のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcKeiNo サブオプションサービス契約番号
	 * @return サブオプションサービス契約に紐付く申込のカレントレコード
	 */
	private CAANMsg getCurMskmViaSbopKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo, String sbopSvcKeiNo)
	{
		// サブオプションサービス契約のカレントレコードを取得
		CAANMsg kk0401Cur = getCurSbopKei(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo);
		
		String mskmDtlNo = kk0401Cur.getString(KK0401ETMsg.MSKM_DTL_NO);
		
		// 申込明細のカレントレコードを取得
		CAANMsg kk0021Cur = getCurMskmDtl(inCBSMsg, inContext, mskmDtlNo);
		
		String mskmNo = kk0021Cur.getString(KK0021ETMsg.MSKM_NO);

		// 申込のカレントレコードを取得
		CAANMsg kk0011Cur = getCurMskm(inCBSMsg, inContext, mskmNo);
		
		return kk0011Cur;
	}
		
	/**
	 * <p>
	 * サブオプションサービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcKeiNo サブオプションサービス契約番号
	 * @return サブオプションサービス契約のカレントレコード
	 */
	private CAANMsg getCurSbopKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo, String sbopSvcKeiNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		CAANMsg kk0401Cond = new CAANMsg(KK0401ETMsg.class.getName());
		kk0401Cond.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		kk0401Cond.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		kk0401Cond.set(KK0401ETMsg.RSV_APLY_YMD, opeDate);
		
		return new JKKejbKK0401DBABase().findByCurrent(kk0401Cond);
	}
	
	/**
	 * <p>
	 * オプションサービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約のカレントレコード
	 */
	private CAANMsg getCurOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		CAANMsg kk0351Cond = new CAANMsg(KK0351ETMsg.class.getName());
		kk0351Cond.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		kk0351Cond.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);
		
		return new JKKejbKK0351DBABase().findByCurrent(kk0351Cond);
	}
	
	/**
	 * <p>
	 * サービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo	サービス契約番号
	 * @return サービス契約のカレントレコード
	 */
	private CAANMsg getCurSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		CAANMsg kk0081Cond = new CAANMsg(KK0081ETMsg.class.getName());
		kk0081Cond.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		kk0081Cond.set(KK0081ETMsg.RSV_APLY_YMD, opeDate);
		
		return new JKKejbKK0081DBABase().findByCurrent(kk0081Cond);
	}
	
	/**
	 * <p>
	 * サービス契約内訳のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiUcwkNo	サービス契約内訳番号
	 * @return サービス契約内訳のカレントレコード
	 */
	private CAANMsg getCurSvcKeiUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiUcwkNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		CAANMsg kk0161Cond = new CAANMsg(KK0161ETMsg.class.getName());
		kk0161Cond.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		kk0161Cond.set(KK0161ETMsg.RSV_APLY_YMD, opeDate);
		
		return new JKKejbKK0161DBABase().findByCurrent(kk0161Cond);
	}
	
	/**
	 * <p>
	 * オプションサービス契約に紐付くサービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約に紐付くサービス契約のカレントレコード
	 */
	private CAANMsg getCurSvcKeiViaOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		// オプションサービス契約のカレントレコードを取得
		CAANMsg kk0351Cur = getCurOpKei(inCBSMsg, inContext, opSvcKeiNo);

		String svcKeiNo = kk0351Cur.getString(KK0351ETMsg.SVC_KEI_NO);

		if (OYA_KEI_SKBT_SVCKEI_UCWK.equals(kk0351Cur.getString(KK0351ETMsg.OYA_KEI_SKBT_CD)))
		{
			// 親契約がサービス契約内訳の場合
			CAANMsg kk0161Cur = getCurSvcKeiUcwk(inCBSMsg, inContext, kk0351Cur.getString(KK0351ETMsg.SVC_KEI_UCWK_NO));
			svcKeiNo = kk0161Cur.getString(KK0161ETMsg.SVC_KEI_NO);
		}

		
		// サービス契約のカレントレコードを取得
		CAANMsg kk0081Cur = getCurSvcKei(inCBSMsg, inContext, svcKeiNo);
		
		return kk0081Cur;
	}
	
	/**
	 * <p>
	 * サブオプションサービス契約の開始に伴うサブオプションサービス契約の登録内容の設定を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Msg　サブオプションサービス契約のETメッセージ
	 * @param staYmd　開始年月日
	 * @param chrgStaYmd　課金開始年月日
	 * @return サブオプションサービス契約の登録内容
	 */
	private CAANMsg setInfoOfOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Msg,
									String staYmd, String chrgStaYmd)
	{
		String opSvcKeiNo = kk0401Msg.getString(KK0401ETMsg.OP_SVC_KEI_NO);
		String sbopSvcKeiNo = kk0401Msg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);
// ANK-4427-00-00 ADD START
		// サービスインターフェイスID
		String templateID = inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY);
// ANK-4427-00-00 ADD END

		// 引継元となるサブオプションサービス契約カレントレコード取得
		CAANMsg ret = getCurSbopKei(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo);
		
		// 入力値設定
		ret.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		ret.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		ret.set(KK0401ETMsg.GENE_ADD_DTM, JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		ret.set(KK0401ETMsg.SBOP_SVC_KEI_STAT, STAT_USING);
		String opedate = JKKModelCommon.getOpeDate(inCBSMsg);
		// 運用日 ＞ サービス開始年月日の場合
		if (JPCUtilCommon.isPastDate(staYmd, opedate, "0"))
		{
			ret.set(KK0401ETMsg.RSV_APLY_YMD, opedate);
		}
		else
		{
			ret.set(KK0401ETMsg.RSV_APLY_YMD, staYmd);
		}
		ret.set(KK0401ETMsg.RSV_APLY_CD, APLYCD_DECIDED);
		ret.set(KK0401ETMsg.PLAN_STAYMD, staYmd);
		ret.set(KK0401ETMsg.PLAN_ENDYMD, SYS_LASTYMD);
		ret.set(KK0401ETMsg.PLAN_CHRG_STAYMD, chrgStaYmd);
		ret.set(KK0401ETMsg.PLAN_CHRG_ENDYMD, SYS_LASTYMD);
		ret.set(KK0401ETMsg.SVC_STAYMD, staYmd);
		ret.set(KK0401ETMsg.SVC_CHRG_STAYMD, chrgStaYmd);
		ret.set(KK0401ETMsg.SVC_ENDYMD, SYS_LASTYMD);
		ret.set(KK0401ETMsg.SVC_CHRG_ENDYMD, SYS_LASTYMD);
		ret.set(KK0401ETMsg.IDO_DIV, kk0401Msg.getString(KK0401ETMsg.IDO_DIV));
		ret.set(KK0401ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		ret.set(KK0401ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		ret.set(KK0401ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		ret.set(KK0401ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		ret.setNull(KK0401ETMsg.DEL_DTM);
		ret.setNull(KK0401ETMsg.DEL_OPEACNT);
		ret.set(KK0401ETMsg.MK_FLG, MKFLG_VALID);
// ANK-4427-00-00 ADD START
		if ("EKK0411C050".equals(templateID))
		{
			// 表示用サービス提供開始年月日
			String dspSvctkStaymd = kk0401Msg.getString(KK0401ETMsg.DSP_SVCTK_STAYMD);
			if (dspSvctkStaymd != null && dspSvctkStaymd.length() > 0)
			{
				ret.set(KK0401ETMsg.DSP_SVCTK_STAYMD, dspSvctkStaymd);
			}
		}
// ANK-4427-00-00 ADD END
		
		return ret;
	}
	
	/**
	 * <p>
	 * サブオプションサービス契約の開始に伴う異動予約の登録内容の設定を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk1681Msg　異動予約のETメッセージ
	 * @param staYmd　開始年月日
	 * @param chrgStaYmd　課金開始年月日
	 * @param ruleMap 異動対象スキーマ判定相関ルールの結果のマップ
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return 異動予約の登録内容
	 */
	private CAANMsg setInfoOfIdoRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk1681Msg,
										String staYmd, String chrgStaYmd, Map<String, Object> ruleMap, String opSvcKeiNo)
	{
		CAANMsg ret = new CAANMsg(KK1681ETMsg.class.getName());
		
		// 相関ルールの設定値を取得
		String idoRsvDtlCd = (String)ruleMap.get(JKKejbRule0083001.IDO_RSV_DTL_CD);
		String idoRsvStatCd = (String)ruleMap.get(JKKejbRule0083001.IDO_RSV_STAT_CD);
		
		// サブオプションサービス契約のカレントレコードを取得
		CAANMsg kk0401Cur = getCurSbopKei(inCBSMsg, inContext, opSvcKeiNo, kk1681Msg.getString(KK1681ETMsg.SBOP_SVC_KEI_NO));

		// 登録内容設定
		ret.set(KK1681ETMsg.IDO_RSV_NO, JKKModelCommon.getIdoRsvNoKK1681(inCBSMsg, inContext));
		ret.set(KK1681ETMsg.IDO_DIV, kk1681Msg.getString(KK1681ETMsg.IDO_DIV));
		ret.set(KK1681ETMsg.IDO_RSV_DTL_CD, idoRsvDtlCd);
		ret.set(KK1681ETMsg.RSV_APLY_YMD, staYmd);
		ret.set(KK1681ETMsg.IDO_RSV_STAT_CD, idoRsvStatCd);
		ret.set(KK1681ETMsg.MSKM_DTL_NO, kk0401Cur.getString(KK0401ETMsg.MSKM_DTL_NO));

		// Input．オプション引継先サービス契約番号が存在している場合
		if (kk1681Msg.containsKeyOfMsgData(KK1681ETMsg.OP_HKTGI_SK_SVC_KEI_NO))
		{
			// Input．オプション引継先サービス契約番号を設定
			ret.set(KK1681ETMsg.OP_HKTGI_SK_SVC_KEI_NO, kk1681Msg.getString(KK1681ETMsg.OP_HKTGI_SK_SVC_KEI_NO));
		}

		ret.set(KK1681ETMsg.SBOP_SVC_KEI_NO, kk1681Msg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		ret.set(KK1681ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		ret.set(KK1681ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		ret.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		ret.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		ret.set(KK1681ETMsg.MK_FLG, MKFLG_VALID);
		
		return ret;
	}

	/**
	 * <p>
	 * サブオプションサービス契約の登録を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Msg　サブオプションサービス契約のETメッセージ
	 */
	private void createKK0401(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Msg)
	{
		JKKejbDBAUtil dbaU = new JKKejbDBAUtil(inCBSMsg);
		dbaU.create(kk0401Msg);
	}

	/**
	 * <p>
	 * 異動予約の登録を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk1681Msg　異動予約のETメッセージ
	 */
	private void createKK1681(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk1681Msg)
	{
		JKKejbDBAUtil dbaU = new JKKejbDBAUtil(inCBSMsg);
		dbaU.create(kk1681Msg);
	}

	/**
	 * <p>
	 * 申込期間を取得する
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param mskmYmd 申込日
	 * @param svcStaYmd サービス開始日
	 * @param svcChrgStaymd サービス課金開始日
	 * @return 申込期間
	 */
	private String getMskmPeriod(CAANMsg inCBSMsg, String mskmYmd, String svcStaYmd, String svcChrgStaymd)
	{
		// 申込期間を取得
		JKKejbRule0088001 rule0088 = new JKKejbRule0088001(inCBSMsg);
		rule0088.setMskm_ymd(mskmYmd);
		rule0088.setSvc_sta_ymd(svcStaYmd);
		rule0088.setSvc_chrg_staymd(svcChrgStaymd);
		return rule0088.getMskmPeriodDef();
	}
	
	/**
	 * <p>
	 * オプションサービス契約番号に紐づくサブオプションサービス契約を遡及解約します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param svcChrgEndYmd サービス課金終了年月日
	 */
	public void sokyuKK0401(CAANMsg inCBSMsg, String opSvcKeiNo, String svcChrgEndYmd)
	{
		CAANMsg[] kk0401List;
		String opedate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		JKKejbKK0401DBABase dbaBase = new JKKejbKK0401DBABase();
		
		// オプションサービス契約番号に紐づくサブオプションサービス契約を取得
		kk0401List = dbaBase.getKK0401byOpSvcKei(opSvcKeiNo, null, opedate);
		
		for (CAANMsg kk0401Data : kk0401List)
		{
			// サブオプションサービス契約ステータスが解約済でサービス契約よりも課金終了年月日が遅い場合
			if (JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(kk0401Data.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT))
					&& !kk0401Data.isNull(KK0401ETMsg.SVC_CHRG_ENDYMD)
					&& kk0401Data.getString(KK0401ETMsg.SVC_CHRG_ENDYMD).compareTo(svcChrgEndYmd) > 0
					&& (inCBSMsg.isNull(EKK0081C260CBSMsg.MSKM_DTL_NO) 
							|| !inCBSMsg.getString(EKK0081C260CBSMsg.MSKM_DTL_NO).equals(kk0401Data.getString(KK0401ETMsg.MSKM_DTL_NO))))
			{
				String svcEndYmd = inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD);
				
				// 遡及解約に伴う更新処理
				CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
				inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo); // オプションサービス契約番号
				inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, kk0401Data.getString(KK0401ETMsg.SBOP_SVC_KEI_NO)); // サブオプションサービス契約番号
				inETMsg.set(KK0401ETMsg.GENE_ADD_DTM, kk0401Data.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); // プラン課金終了年月日
				
				// 予約適用年月日
				if (opedate.compareTo(svcEndYmd) > 0)
				{
					// サービス終了年月日が運用日付より過去の場合運用日付を設定
					inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, opedate);
				}
				else
				{
					// 上記以外の場合サービス終了年月日を設定
					inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, svcEndYmd);
				}
				
				inETMsg.set(KK0401ETMsg.RSV_APLY_CD, JKKModelConst.RSV_APLY_CD_RSV_FIX); // 予約適用コード
				inETMsg.set(KK0401ETMsg.SVC_ENDYMD, svcEndYmd); // サービス終了年月日
				inETMsg.set(KK0401ETMsg.SVC_CHRG_ENDYMD, svcChrgEndYmd); // サービス課金終了年月日
				inETMsg.set(KK0401ETMsg.SVC_DLRE_CD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_DLRE_CD)); // サービス解約理由コード
				inETMsg.set(KK0401ETMsg.SVC_DLRE_MEMO, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_DLRE_MEMO)); // サービス解約理由メモ
				inETMsg.set(KK0401ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
				inETMsg.set(KK0401ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
				
				JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inCBSMsg);
				dbaUtil.update(inETMsg);
			}
		}
	}
// ▽▽▽ ANK-3484-00-00 START START
	/**
	 * <p>
	 * サブオプションサービス契約<ISP>のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcKeiNo サブオプションサービス契約番号
	 * @return オプションサービス契約のカレントレコード
	 */
	private CAANMsg getCurSbopKeiIsp(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo, String sbopSvcKeiNo)
	{
		
		CAANMsg kk0411Cond = new CAANMsg(KK0411ETMsg.class.getName());
		kk0411Cond.set(KK0411ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		kk0411Cond.set(KK0411ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		
		return new JKKejbKK0411DBABase().findByCurrent(kk0411Cond);
	}
	/**
	 * 解約済の端末補償の引継元課金終了日を取得する。(複数存在する場合は、直近の日付）
	 * <p>
	 * @param inETMsg   メッセージ
	 * @param inContext コンテキスト
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcCd サブオプションサービスコード
	 */
	public String getPreviousSvcChrgEnd(CAANMsg inETMsg, AgentDispatchContext inContext, String opSvcKeiNo, String sbopSvcCd)
	{
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     MAX(KK0401.SVC_CHRG_ENDYMD) AS SVC_CHRG_ENDYMD ")
					.append(" FROM KK_T_SBOP_SVC_KEI KK0401")
					.append(" WHERE ")
					.append("     KK0401.OP_SVC_KEI_NO IN")
					.append("      (")
					.append("         SELECT KK0361.OP_SVC_KEI_NO")
					.append("           FROM KK_T_OPSVKEI_ISP KK0361")
					.append("           WHERE ")
					.append("               KK0361.OP_SVC_KEI_NO != ?")
					.append("             AND ")
					.append("               KK0361.TMCP_KEI_NO IN (")
					.append("                 SELECT KK0361_TMCP.TMCP_KEI_NO  ")
					.append("                   FROM KK_T_OPSVKEI_ISP KK0361_TMCP ")
					.append("                   WHERE KK0361_TMCP.OP_SVC_KEI_NO = ?")
					.append("               ) ")
					.append("             AND ")
					.append("               KK0361.MK_FLG = '0'")
					.append("      )")
					.append("   AND")
					.append("     (KK0401.RSV_APLY_YMD || KK0401.GENE_ADD_DTM) =")
					.append("      (")
					.append("         SELECT MAX(KK0401_MAX.RSV_APLY_YMD || KK0401_MAX.GENE_ADD_DTM)")
					.append("            FROM KK_T_SBOP_SVC_KEI KK0401_MAX")
					.append("             WHERE ")
					.append("                 KK0401_MAX.OP_SVC_KEI_NO = KK0401.OP_SVC_KEI_NO")
					.append("               AND")
					.append("                 KK0401_MAX.SBOP_SVC_KEI_NO = KK0401.SBOP_SVC_KEI_NO")
					.append("               AND")
					.append("                 KK0401_MAX.RSV_APLY_YMD <= ?")
					.append("               AND")
					.append("                 KK0401_MAX.RSV_APLY_CD = '2'")
					.append("               AND ")
					.append("                 KK0401_MAX.MK_FLG = '0'")
					.append("       )")
					.append("   AND")
					.append("     KK0401.SBOP_SVC_KEI_STAT = '910'")
					.append("   AND")
					.append("     KK0401.SBOP_SVC_CD = ?")
					.append("   AND")
					.append("     KK0401.MK_FLG = '0'");
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(オプションサービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, opSvcKeiNo);
			// パラメータの設定(オプションサービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 2, opSvcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inETMsg));
			// パラメータの設定(サブオプションサービスコードを指定)
			CAANJDBCUtil.setParam(pstmt, 4, sbopSvcCd);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			String chagEndYmd = "";

			// 課金終了日を取得する
			if (rsltQuery.next())
			{
				chagEndYmd = rsltQuery.getString("SVC_CHRG_ENDYMD");
			}
			
			return chagEndYmd;
		}
		catch (SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch (SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}

// △△△ ANK-3484-00-00 START END
}
