/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0081C013ETDA
*   ソースファイル名：JEKK0081C013ETDA.java
*   作成者          ：富士通
*   日付            ：2011年11月02日
*＜機能概要＞
*   サービス契約サービス開始日変更DBアクセス処理部品です。
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/11/02  富士通      新規作成
*	v5.00.00	2013/08/25	FJ)沖田		OM-2013-0000572
*   v5.00.01    2013/10/16  FJ)寺本     OM-2013-0001940
*   v5.00.02    2013/10/23  FJ)寺園     OM-2013-0003075
*   v5.00.03    2013/11/12  FJ)寺園     OM-2013-0004163
*   v7.00.00    2013/12/07  FJ)大山     ANK-1578-00-00
*   v7.00.01    2014/02/04  FJ)寺園     OM-2014-0000293
*   v11.00.00	2014/12/11  FJ)谷口     ANK-2423-00-00
*   v12.00.00   2015/02/27  FJ)鯵坂     OM-2015-0000134
*   v20.00.00   2015/12/08  FJ)谷口     OM-2015-0002488
*   v71.00.00   2024/03/08  FJ)北村     #83846 サービスの利用開始日を変更した場合、HGWであれば機器OPのサービス開始日が洗替されない。
**********************************************************************/

package eo.ejb.common.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANException;
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.JPCDateUtil;
import eo.ejb.cbm.entity.CH0501ETMsg;
import eo.ejb.cbm.entity.KK0021ETMsg;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0161LE;
import eo.ejb.cbm.entity.KK0191ETMsg;
import eo.ejb.cbm.entity.KK0241ETMsg;
import eo.ejb.cbm.entity.KK0241LE;
import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbm.entity.KK0341LE;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0401LE;
import eo.ejb.cbm.entity.KK0781ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbm.entity.KK2811ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0081C013CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.JKKejbBusinessException;
import eo.ejb.common.edit.JKKejbEditUtil;
import eo.ejb.common.rule.JKKejbRule0065001;
import eo.ejb.common.rule.JKKejbRule0067001;
import eo.ejb.common.rule.JKKejbRule0073001;
import eo.ejb.common.rule.JKKejbRule0075001;
import eo.ejb.common.rule.JKKejbRule0091001;


/**
 * <p>
 * サービス契約サービス開始日変更DBアクセス処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0081C013ETDA
{

	/** 無効フラグ_有効 */
	private static final String MKFLG_VALID = "0";

	/** 異動予約詳細コード_サービス開始 */
	private static final String IDO_DTLCD_SVC_START = "004";
	
	/** 異動予約詳細コード_機器開始 */
	private static final String IDO_DTLCD_KKTK_START = "010";
	
	/** 異動予約詳細コード_オプション開始 */
	private static final String IDO_DTLCD_OP_START = "014";
	
	/** 異動予約詳細コード_サブオプション開始 */
	private static final String IDO_DTLCD_SBOP_START = "017";
	
	/** 異動予約状態コード_異動予約対象外 */
	private static final String IDO_STATCD_IDORSV_OUT_TARGET = "04";

	/** サービス契約ステータス_締結済 */
	private static final String SVCKEI_STAT_TEIKETU = "030";
	
	/** サービス契約ステータス_サービス提供中 */
	private static final String SVCKEI_STAT_TEIKYOU = "100";

	/** 機器提供サービス契約ステータス_締結済 */
	private static final String KKTKSVCKEI_STAT_TEIKETU = "030";

	/** 機器提供サービス契約ステータス_サービス提供中 */
	private static final String KKTKSVCKEI_STAT_TEIKYOU = "100";
	
	/** 月初 */
	public static final String GESYO = "01";

	/** 月初設定用 */
	public static final String GESYO_SETTEI = "1";

	/** 月初以外設定用 */
	public static final String GESYO_IGAI_SETTEI = "0";

	/** サービスコード インターネット */
	private static final String SVCCD_INTERNET = "01";
	
	/**
	 * コンストラクタです。
	 */
	public JEKK0081C013ETDA()
	{
	}

	/**
	 * <p>
	 * サービス契約サービス開始日変更DBアクセス処理
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * </p>
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// サービス契約DBアクセス処理の呼出し
		dbAccessSvcKei(inCBSMsg, inContext);

		// サービス契約内訳DBアクセス処理の呼出し
		dbAccessSvcKeiUcwk(inCBSMsg, inContext);

		// 機器提供サービス契約DBアクセス処理の呼出し
		dbAccessKktkSvcKei(inCBSMsg, inContext);

		// オプションサービス契約DBアクセス処理の呼出し
		dbAccessOpSvcKei(inCBSMsg, inContext);

		// 機器オプションサービス契約DBアクセス処理の呼出し
		dbAccessKkopSvcKei(inCBSMsg, inContext);
	}

	/**
	 * <p>
	 * サービス契約DBアクセス処理を行います
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * </p>
	 */
	private void dbAccessSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String svcKeiNo = inCBSMsg.getString(EKK0081C013CBSMsg.SVC_KEI_NO);
		if (null == svcKeiNo)
		{
			return;
		}

		// サービス契約カレント取得
		CAANMsg curRetMsg = getCurrentSvcKei(inCBSMsg, inContext, svcKeiNo);

		String stat = curRetMsg.getString(KK0081ETMsg.SVC_KEI_STAT);

		// カレントの状態が"サービス提供中"の場合
		if (SVCKEI_STAT_TEIKYOU.equals(stat))
		{
			// メッセージの設定
			curRetMsg = setSvcKeiColumn(inCBSMsg, inContext, curRetMsg);
			// 更新処理
			update(inCBSMsg, curRetMsg);

			// O項目のセット
			inCBSMsg.set(EKK0081C013CBSMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
			inCBSMsg.set(EKK0081C013CBSMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		}
	}	

	/**
	 * <p>
	 * サービス契約の項目の設定を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg サービス契約のメッセージ
	 * @return inMsg 編集後のサービス契約のメッセージ
	 * </p>
	 */
	private CAANMsg setSvcKeiColumn(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg)
	{
		// サービス課金開始年月日の取得
		String svcChrgStaymd = getSvcChrgStaymdOfSvcKei(inCBSMsg, inContext, inMsg, inCBSMsg.getString(EKK0081C013CBSMsg.SVC_STA_YMD));
		if (null == svcChrgStaymd)
		{
			throw new JKKejbBusinessException("課金開始日設定(サービス)の相関ルールの結果、日付を取得できませんでした。");
		}

		inMsg.set(KK0081ETMsg.PLAN_STAYMD, inCBSMsg.getString(EKK0081C013CBSMsg.SVC_STA_YMD));
		inMsg.set(KK0081ETMsg.PLAN_CHRG_STAYMD, svcChrgStaymd);
		inMsg.set(KK0081ETMsg.SVC_STA_YMD, inCBSMsg.getString(EKK0081C013CBSMsg.SVC_STA_YMD));
		inMsg.set(KK0081ETMsg.SVC_CHRG_STAYMD, svcChrgStaymd);
		inMsg.set(KK0081ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inMsg.set(KK0081ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		
		// 出力項目にサービス課金開始年月日を設定
		inCBSMsg.set(EKK0081C013CBSMsg.SVC_CHRG_STAYMD, svcChrgStaymd);
		
		return inMsg;
	}

	/**
	 * <p>
	 * サービス契約内訳DBアクセス処理を行います
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * </p>
	 */
	private void dbAccessSvcKeiUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String svcKeiNo = inCBSMsg.getString(EKK0081C013CBSMsg.SVC_KEI_NO);

		// サービス契約番号に紐付くレコードを取得
		CAANMsg conInMsg = new CAANMsg(KK0161ETMsg.class.getName());
		conInMsg.set(KK0161ETMsg.SVC_KEI_NO, svcKeiNo);
		conInMsg.set(KK0161ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] conRetMsg = null;
		try
		{
			conRetMsg = new KK0161LE().findByCondition(conInMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		String primaryKey = null;
		HashMap<String, String> escapeMap = new HashMap<String, String>();
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		for (CAANMsg retMsg : conRetMsg)
		{
			// プライマリキーを取得
			primaryKey = retMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);

			if (!escapeMap.containsKey(primaryKey))
			{
				// 初検索の場合
				escapeMap.put(primaryKey, null);

				// カレント検索
				CAANMsg curInMsg = new CAANMsg(KK0161ETMsg.class.getName());
				curInMsg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, primaryKey);
				curInMsg.set(KK0161ETMsg.RSV_APLY_YMD, opeDate);
				CAANMsg curRetMsg = new JKKejbKK0161DBABase().findByCurrent(curInMsg);

				// 抽出条件と同じ条件のカレントのみ対象
				if (svcKeiNo.equals(curRetMsg.getString(KK0161ETMsg.SVC_KEI_NO))
						&& MKFLG_VALID.equals(curRetMsg.getString(KK0161ETMsg.MK_FLG)))
				{
					String stat = curRetMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT);

					// カレントの状態が"締結済"の場合
					if (SVCKEI_STAT_TEIKETU.equals(stat))
					{
						dbAccessSvcKeiUcwkRsv(inCBSMsg, inContext, curRetMsg); // サービス契約内訳予約レコードのDBアクセス
					}
					// カレントの状態が"サービス提供中"の場合
					else if (SVCKEI_STAT_TEIKYOU.equals(stat))
					{
						// メッセージの設定
						curRetMsg = setSvcKeiUcwkColumn(inCBSMsg, inContext, curRetMsg);

						// 更新処理
						update(inCBSMsg, curRetMsg);
					}
				}
			}
		}
	}	

	/**
	 * <p>
	 * サービス契約内訳予約レコードDBアクセス処理を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param curRetMsg サービス契約内訳のカレントレコード
	 * </p>
	 */
	private void dbAccessSvcKeiUcwkRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg curRetMsg)
	{
		String svcKeiUcwkNo = curRetMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);

		// 予約検索
		CAANMsg rsvInMsg = new CAANMsg(KK0161ETMsg.class.getName());
		rsvInMsg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		rsvInMsg.set(KK0161ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		CAANMsg[] rsvRetMsg = new JKKejbKK0161DBABase().findByReserve(rsvInMsg);

		for (CAANMsg retMsgRsv : rsvRetMsg)
		{
			// 1件のみの想定
			// "サービス提供中"のレコードのみ対象
			if (SVCKEI_STAT_TEIKYOU.equals(retMsgRsv.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT)))
			{
				// メッセージの設定
				retMsgRsv = setSvcKeiUcwkColumn(inCBSMsg, inContext, retMsgRsv);

				// 更新処理
				update(inCBSMsg, retMsgRsv);
				dbAccessIdoOfSvcKeiUcwk(inCBSMsg, inContext, curRetMsg, retMsgRsv.getString(KK0161ETMsg.SVC_STA_YMD)); // 異動予約レコードのDBアクセス
			}
		}
	}	

	/**
	 * <p>
	 * サービス契約内訳に紐付く異動予約のDBアクセス処理を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param curRetMsg サービス契約内訳のカレントレコード
	 * @param staYmd サービス開始年月日
	 * </p>
	 */
	private void dbAccessIdoOfSvcKeiUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg curRetMsg, String staYmd)
	{
		String svcKeiUcwkNo = curRetMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);

		// 異動予約の検索条件を設定
		CAANMsg conInMsg = new CAANMsg(KK1681ETMsg.class.getName());
		conInMsg.set(KK1681ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		conInMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDO_DTLCD_SVC_START);
		conInMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDO_STATCD_IDORSV_OUT_TARGET);
		conInMsg.set(KK1681ETMsg.MK_FLG, MKFLG_VALID);

		// 異動予約更新処理の呼出し
		updIdoRsv(inCBSMsg, inContext, conInMsg, staYmd);
	}	

	/**
	 * <p>
	 * サービス契約内訳の項目の設定を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg サービス契約内訳のメッセージ
	 * @return inMsg 編集後のサービス契約内訳のメッセージ
	 * </p>
	 */
	private CAANMsg setSvcKeiUcwkColumn(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg)
	{
		// ANK-2423-00-00 MOD START
		// サービス開始日は画面から入力されたのをベースにする。
//		String staYmd = getStaYmdUcwk(inCBSMsg, inContext, inMsg);
//		if (null == staYmd)
//		{
//			throw new JKKejbBusinessException("サービス開始日（サービス）の相関ルールの結果、日付を取得できませんでした。");
//		}
		String staYmd = inCBSMsg.getString(EKK0081C013CBSMsg.SVC_STA_YMD);
		// ANK-2423-00-00 MOD END
		
		// サービス課金開始年月日の取得
		String svcChrgStaymd = getSvcChrgStaymdOfSvcKeiUcwk(inCBSMsg, inContext, inMsg, staYmd);
		if (null == svcChrgStaymd)
		{
			throw new JKKejbBusinessException("課金開始日設定(サービス)の相関ルールの結果、日付を取得できませんでした。");
		}

		inMsg.set(KK0161ETMsg.PLAN_STAYMD, staYmd);
		inMsg.set(KK0161ETMsg.PLAN_CHRG_STAYMD, svcChrgStaymd);
		inMsg.set(KK0161ETMsg.SVC_STA_YMD, staYmd);
		inMsg.set(KK0161ETMsg.SVC_CHRG_STAYMD, svcChrgStaymd);
		inMsg.set(KK0161ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inMsg.set(KK0161ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		return inMsg;
	}

	/**
	 * <p>
	 * 機器提供サービス契約DBアクセス処理を行います
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * </p>
	 */
	private void dbAccessKktkSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String svcKeiNo = inCBSMsg.getString(EKK0081C013CBSMsg.SVC_KEI_NO);
		if (null == svcKeiNo)
		{
			return;
		}

		// サービス契約番号に紐付くレコードを取得
		CAANMsg conInMsg = new CAANMsg(KK0341ETMsg.class.getName());
		conInMsg.set(KK0341ETMsg.SVC_KEI_NO, svcKeiNo);
		conInMsg.set(KK0341ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] conRetMsg = null;
		try
		{
			conRetMsg = new KK0341LE().findByCondition(conInMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// サービス契約番号に紐付く機器提供サービス契約が存在する場合
		if (0 < conRetMsg.length)
		{
			kktkSvcKeiFromSvcKeiNo(inCBSMsg, inContext, conRetMsg);
			
			CAANMsg[] kaisenUcwkRecords =  getValidSvcKeiKaisenUcwk(inCBSMsg, inContext, svcKeiNo);
			
			// 有効な回線対象サービス契約が存在する場合
			if (null != kaisenUcwkRecords)
			{
				for (CAANMsg kaisenUcwkRecord : kaisenUcwkRecords)
				{
					kktkSvcKeiFromKaisenUcwkNo(inCBSMsg, inContext, kaisenUcwkRecord);
				}
			}
		}
		// サービス契約番号に紐付く機器提供サービス契約が存在しない場合
		else if (0 == conRetMsg.length)
		{
			CAANMsg[] kaisenUcwkRecords =  getValidSvcKeiKaisenUcwk(inCBSMsg, inContext, svcKeiNo);
			
			// 有効な回線対象サービス契約が存在する場合
			if (null != kaisenUcwkRecords)
			{
				for (CAANMsg kaisenUcwkRecord : kaisenUcwkRecords)
				{
					kktkSvcKeiFromKaisenUcwkNo(inCBSMsg, inContext, kaisenUcwkRecord);
				}
			}
		}
	}	

	/**
	 * <p>
	 * サービス契約番号に紐付く機器提供サービス契約DBアクセス処理を行います
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kktkSvcKeiRecords サービス契約番号に紐付く機器提供サービス契約のレコード
	 * </p>
	 */
	private void kktkSvcKeiFromSvcKeiNo(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg[] kktkSvcKeiRecords)
	{
		String svcKeiNo = inCBSMsg.getString(EKK0081C013CBSMsg.SVC_KEI_NO);
		String primaryKey = null;
		HashMap<String, String> escapeMap = new HashMap<String, String>();
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		for (CAANMsg retMsg : kktkSvcKeiRecords)
		{
			// プライマリキーを取得
			primaryKey = retMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);

			if (!escapeMap.containsKey(primaryKey))
			{
				// 初検索の場合
				escapeMap.put(primaryKey, null);

				// カレント検索
				CAANMsg curInMsg = new CAANMsg(KK0341ETMsg.class.getName());
				curInMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, primaryKey);
				curInMsg.set(KK0341ETMsg.RSV_APLY_YMD, opeDate);
				CAANMsg curRetMsg = new JKKejbKK0341DBABase().findByCurrent(curInMsg);

				// 抽出条件と同じ条件のカレントのみ対象
				if (svcKeiNo.equals(curRetMsg.getString(KK0341ETMsg.SVC_KEI_NO))
						&& MKFLG_VALID.equals(curRetMsg.getString(KK0341ETMsg.MK_FLG)))
				{
					String stat = curRetMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT);
					// カレントの状態が"締結済"の場合
					if (SVCKEI_STAT_TEIKETU.equals(stat))
					{
						dbAccessKktkSvcKeiRsv(inCBSMsg, inContext, curRetMsg); // 機器提供サービス契約予約レコードのDBアクセス
					}
					// カレントの状態が"サービス提供中"の場合
					else if (SVCKEI_STAT_TEIKYOU.equals(stat))
					{
						// メッセージの設定
						curRetMsg = setKktkSvcKeiColumn(inCBSMsg, inContext, curRetMsg);

						// 更新処理
						update(inCBSMsg, curRetMsg);
					}
				}
			}
		}
	}	

	/**
	 * <p>
	 * サービス契約回線内訳番号に紐付く機器提供サービス契約DBアクセス処理を行います
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kaisenUcwkRecord サービス契約番号に紐付く回線対象サービス契約のレコード
	 * </p>
	 */
	private void kktkSvcKeiFromKaisenUcwkNo(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kaisenUcwkRecord)
	{
		
		String kaisenUcwkNo = kaisenUcwkRecord.getString(KK0241ETMsg.SVC_KEI_KAISEN_UCWK_NO);

		// サービス契約回線内訳番号に紐付くレコードを取得
		CAANMsg conInMsg = new CAANMsg(KK0341ETMsg.class.getName());
		conInMsg.set(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO, kaisenUcwkNo);
		conInMsg.set(KK0341ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] conRetMsg = null;
		try
		{
			conRetMsg = new KK0341LE().findByCondition(conInMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		String primaryKey = null;
		HashMap<String, String> escapeMap = new HashMap<String, String>();
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		for (CAANMsg retMsg : conRetMsg)
		{
			// プライマリキーを取得
			primaryKey = retMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);

			if (!escapeMap.containsKey(primaryKey))
			{
				// 初検索の場合
				escapeMap.put(primaryKey, null);

				// カレント検索
				CAANMsg curInMsg = new CAANMsg(KK0341ETMsg.class.getName());
				curInMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, primaryKey);
				curInMsg.set(KK0341ETMsg.RSV_APLY_YMD, opeDate);
				CAANMsg curRetMsg = new JKKejbKK0341DBABase().findByCurrent(curInMsg);

				// 抽出条件と同じ条件のカレントのみ対象
				if (kaisenUcwkNo.equals(curRetMsg.getString(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO))
						&& MKFLG_VALID.equals(curRetMsg.getString(KK0341ETMsg.MK_FLG)))
				{
					String stat = curRetMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT);

					// 締結済の場合
					if (KKTKSVCKEI_STAT_TEIKETU.equals(stat))
					{
						dbAccessKktkSvcKeiRsv(inCBSMsg, inContext, curRetMsg); // 機器提供サービス契約予約レコードのDBアクセス
					}
					// サービス提供中の場合
					else if (KKTKSVCKEI_STAT_TEIKYOU.equals(stat))
					{
						// メッセージの設定
						curRetMsg = setKktkSvcKeiColumn(inCBSMsg, inContext, curRetMsg);

						// 更新処理
						update(inCBSMsg, curRetMsg);
					}
				}
			}
		}	
	}

	/**
	 * <p>
	 * 機器提供サービス契約予約レコードDBアクセス処理を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param curRetMsg 機器提供サービス契約のカレントレコード
	 * </p>
	 */
	private void dbAccessKktkSvcKeiRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg curRetMsg)
	{
		String kktkSvcKeiNo = curRetMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);

		// 予約検索
		CAANMsg rsvInMsg = new CAANMsg(KK0341ETMsg.class.getName());
		rsvInMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		rsvInMsg.set(KK0341ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		CAANMsg[] rsvRetMsg = new JKKejbKK0341DBABase().findByReserve(rsvInMsg);

		for (CAANMsg retMsgRsv : rsvRetMsg)
		{
			// 1件のみの想定
			// "サービス提供中"のレコードのみ対象
			if (KKTKSVCKEI_STAT_TEIKYOU.equals(retMsgRsv.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT)))
			{
				// メッセージの設定
				retMsgRsv = setKktkSvcKeiColumn(inCBSMsg, inContext, retMsgRsv);

				// 更新処理
				update(inCBSMsg, retMsgRsv);
				dbAccessIdoOfKktkSvcKei(inCBSMsg, inContext, curRetMsg, retMsgRsv.getString(KK0341ETMsg.SVC_STA_YMD)); // 異動予約レコードのDBアクセス
			}
		}
	}	

	/**
	 * <p>
	 * 機器提供サービス契約に紐付く異動予約のDBアクセス処理を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param curRetMsg 機器提供サービス契約のカレントレコード
	 * @param staYmd サービス開始年月日
	 * </p>
	 */
	private void dbAccessIdoOfKktkSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg curRetMsg, String staYmd)
	{
		String kktkSvcKeiNo = curRetMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);

		// 異動予約の検索条件を設定
		CAANMsg conInMsg = new CAANMsg(KK1681ETMsg.class.getName());
		conInMsg.set(KK1681ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		conInMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDO_DTLCD_KKTK_START);
		conInMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDO_STATCD_IDORSV_OUT_TARGET);
		conInMsg.set(KK1681ETMsg.MK_FLG, MKFLG_VALID);

		// 異動予約更新処理の呼出し
		updIdoRsv(inCBSMsg, inContext, conInMsg, staYmd);
	}	

	/**
	 * <p>
	 * 機器提供サービス契約の項目の設定を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 機器提供サービス契約のメッセージ
	 * @return inMsg 編集後の機器提供サービス契約のメッセージ
	 * </p>
	 */
	private CAANMsg setKktkSvcKeiColumn(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg)
	{
		// サービス開始日の取得
		String staYmd = getSvcStaymdOfKktkSvcKei(inCBSMsg, inContext, inMsg);
		if(null == staYmd)
		{
			throw new JKKejbBusinessException("開始日設定(機器提供サービス)の相関ルールの結果、日付を取得できませんでした。");
		}
		// サービス課金開始年月日の取得
		String svcChrgStaymd = getSvcChrgStaymdOfKktkSvcKei(inCBSMsg, inContext, inMsg, staYmd);
		if (null == svcChrgStaymd)
		{
			throw new JKKejbBusinessException("課金開始日設定(機器提供サービス)の相関ルールの結果、日付を取得できませんでした。");
		}

		inMsg.set(KK0341ETMsg.PLAN_STAYMD, staYmd);
		inMsg.set(KK0341ETMsg.PLAN_CHRG_STAYMD, svcChrgStaymd);
		inMsg.set(KK0341ETMsg.SVC_STA_YMD, staYmd);
		inMsg.set(KK0341ETMsg.SVC_CHRG_STAYMD, svcChrgStaymd);
		inMsg.set(KK0341ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inMsg.set(KK0341ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		return inMsg;
	}

	/**
	 * <p>
	 * オプションサービス契約DBアクセス処理を行います
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * </p>
	 */
	private void dbAccessOpSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String svcKeiNo = inCBSMsg.getString(EKK0081C013CBSMsg.SVC_KEI_NO);
		if (null == svcKeiNo)
		{
			return;
		}
		// 運用日付を取得
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		// サービス契約番号をKEYにオプションサービス契約番号を特定する
		CAANMsg[] conRetMsg = findByALLCurKK0351BySvc(svcKeiNo, opeDate);

		for (CAANMsg retMsg : conRetMsg)
		{
			// カレント検索
			CAANMsg curInMsg = new CAANMsg(KK0351ETMsg.class.getName());
			curInMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, retMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
			curInMsg.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);
			CAANMsg curRetMsg = new JKKejbKK0351DBABase().findByCurrent(curInMsg);

			String stat = curRetMsg.getString(KK0351ETMsg.OP_SVC_KEI_STAT);

			// カレントの状態が"締結済"の場合
			if (SVCKEI_STAT_TEIKETU.equals(stat))
			{
				curRetMsg.set(KK0351ETMsg.SVC_STAYMD, inCBSMsg.getString(EKK0081C013CBSMsg.SVC_STA_YMD));
				dbAccessIdoOfOpSvcKei(inCBSMsg, inContext, curRetMsg); // 異動予約レコードのDBアクセス
			}
			// カレントの状態が"サービス提供中"の場合
			else if (SVCKEI_STAT_TEIKYOU.equals(stat))
			{
				// オプションサービス契約更新処理
				// メッセージの設定
				curRetMsg = setOpSvcKeiColumn(inCBSMsg, inContext, curRetMsg);
				// 更新処理
				update(inCBSMsg, curRetMsg);
			}
			
			dbAccessSbOpSvcKei(inCBSMsg, inContext, retMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO)); // サブオプションサービス契約DBアクセス処理
		}
	}	

	/**
	 * <p>
	 * サブオプションサービス契約DBアクセス処理を行います
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * </p>
	 */
	private void dbAccessSbOpSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		// オプションサービス契約番号に紐付くレコードを取得
		CAANMsg conInMsg = new CAANMsg(KK0401ETMsg.class.getName());
		conInMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		conInMsg.set(KK0401ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] conRetMsg = null;
		try
		{
			conRetMsg = new KK0401LE().findByCondition(conInMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		String primaryKey = null;
		HashMap<String, String> escapeMap = new HashMap<String, String>();
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		for (CAANMsg retMsg : conRetMsg)
		{
			// プライマリキーを取得(オプションサービス契約番号は全て同じ値)
			primaryKey = retMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);

			if (!escapeMap.containsKey(primaryKey))
			{
				// 初検索の場合
				escapeMap.put(primaryKey, null);

				// カレント検索(カレント検索の結果、オプションサービス契約番号が異なることがないので抽出条件と等しいかの判定はしない)
				CAANMsg curInMsg = new CAANMsg(KK0401ETMsg.class.getName());
				curInMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
				curInMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, primaryKey);
				curInMsg.set(KK0401ETMsg.RSV_APLY_YMD, opeDate);
				CAANMsg curRetMsg = new JKKejbKK0401DBABase().findByCurrent(curInMsg);

				String stat = curRetMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT);

				// カレントの状態が"締結済"の場合
				if (SVCKEI_STAT_TEIKETU.equals(stat))
				{
					curRetMsg.set(KK0401ETMsg.SVC_STAYMD, inCBSMsg.getString(EKK0081C013CBSMsg.SVC_STA_YMD));
					dbAccessIdoOfSbOpSvcKei(inCBSMsg, inContext, curRetMsg); // 異動予約レコードのDBアクセス
				}
				// カレントの状態が"サービス提供中"の場合
				else if (SVCKEI_STAT_TEIKYOU.equals(stat))
				{
					// メッセージの設定
					curRetMsg = setSbOpSvcKeiColumn(inCBSMsg, inContext, curRetMsg);

					// 更新処理
					update(inCBSMsg, curRetMsg);
				}
			}
		}
	}	

	/**
	 * <p>
	 * サブオプションサービス契約に紐付く異動予約のDBアクセス処理を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param curRetMsg サブオプションサービス契約のカレントレコード
	 * </p>
	 */
	private void dbAccessIdoOfSbOpSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg curRetMsg)
	{
		String sbOpSvcKeiNo = curRetMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);

		// 異動予約の検索条件を設定
		CAANMsg conInMsg = new CAANMsg(KK1681ETMsg.class.getName());
		conInMsg.set(KK1681ETMsg.SBOP_SVC_KEI_NO, sbOpSvcKeiNo);
		conInMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDO_DTLCD_SBOP_START);
		conInMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDO_STATCD_IDORSV_OUT_TARGET);
		conInMsg.set(KK1681ETMsg.MK_FLG, MKFLG_VALID);

		// 異動予約更新処理の呼出し
		updIdoRsv(inCBSMsg, inContext, conInMsg, curRetMsg.getString(KK0401ETMsg.SVC_STAYMD));
	}	

	/**
	 * <p>
	 * 有効な回線対象サービス契約を返却します。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return 有効な回線対象サービス契約
	 * </p>
	 */
	private CAANMsg[] getValidSvcKeiKaisenUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// 回線対象サービス契約をサービス契約番号で検索
		CAANMsg conInMsg = new CAANMsg(KK0241ETMsg.class.getName());
		conInMsg.set(KK0241ETMsg.SVC_KEI_NO, svcKeiNo);
		conInMsg.set(KK0241ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] conRetMsg = null;
		try
		{
			conRetMsg = new KK0241LE().findByCondition(conInMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		ArrayList<CAANMsg> kaisenUcwkList = new ArrayList<CAANMsg>();

		for (CAANMsg retMsg : conRetMsg)
		{
			// 回線内訳使用開始年月日 <= 運用日付 <= 回線内訳使用終了年月日 のレコードのみ有効
			if (JKKModelCommon.isPastDate(retMsg.getString(KK0241ETMsg.KAISEN_UCWK_USE_STAYMD), opeDate, "1")
					&& JKKModelCommon.isFutureDate(retMsg.getString(KK0241ETMsg.KAISEN_UCWK_USE_ENDYMD), opeDate, "1"))
			{
				kaisenUcwkList.add(retMsg);
			}
		}

		if (0 < kaisenUcwkList.size())
		{
			return kaisenUcwkList.toArray(new CAANMsg[0]);
		}

		// 有効レコードが存在しない場合
		return null;
	}

	/**
	 * <p>
	 * 機器提供サービス契約のサービス課金開始年月日をルールを、元に算出して返却します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 当メソッド呼出し時の更新対象レコード
	 * @param staYmd サービス開始年月日
	 * @return 算出されたサービス課金開始年月日
	*/
	private String getSvcChrgStaymdOfKktkSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg, String staYmd)
	{
		// サービス契約のカレントレコードを取得
		CAANMsg ret0081 = getCurrentSvcKei(inCBSMsg, inContext, inCBSMsg.getString(EKK0081C013CBSMsg.SVC_KEI_NO));

		// 相関ルールにてサービス課金開始年月日に設定する値を算出
		JKKejbRule0067001 rule0067 = new JKKejbRule0067001(inCBSMsg);

		rule0067.setSvc_cd(ret0081.getString(KK0081ETMsg.SVC_CD)); // サービスコードを設定
		rule0067.setKktk_sbt_cd(inMsg.getString(KK0341ETMsg.KKTK_SBT_CD)); // 機器提供種別コード
		rule0067.setSvc_sta_ymd(staYmd); // サービス開始年月日を設定
		rule0067.setIdo_div(inCBSMsg.getString(EKK0081C013CBSMsg.IDO_DIV)); // 異動区分を設定

		// ルールの呼び出し
		return rule0067.getChrgStaYmd();
	}

	/**
	 * <p>
	 * サービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約のカレントレコード
	*/
	private CAANMsg getCurrentSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// カレント検索
		CAANMsg curInMsg = new CAANMsg(KK0081ETMsg.class.getName());
		curInMsg.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		curInMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		CAANMsg curRetMsg = new JKKejbKK0081DBABase().findByCurrent(curInMsg);

		return curRetMsg;
	}

	/**
	 * <p>
	 * 料金グループのカレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param prcGrpCd 料金グループコード
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0781(CAANMsg inCBSMsg, String prcGrpCd)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0781ETMsg.class.getName());
		inETMsg.set(KK0781ETMsg.PRC_GRP_CD, prcGrpCd);
		inETMsg.set(KK0781ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// 料金グループのカレント検索を行う
		return new JKKejbKK0781DBABase().findByCurrent(inETMsg);
	}
	
	/**
	 * <p>
	 * 検索条件を元に異動予約の一覧を検索して更新処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param conIdoMsg 異動予約テーブル検索用のMsg
	 * @param staYmd サービス開始年月日
	*/
	private void updIdoRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg conIdoMsg, String staYmd)
	{
		CAANMsg[] conRetMsg = null;
		try
		{
			// 検索用のMsgをもとに異動予約の一覧照会を行います
			conRetMsg = new KK1681LE().findByCondition(conIdoMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		for (CAANMsg retMsgIdo : conRetMsg)
		{
			// 予約適用年月日が運用日付より未来日のレコードが更新対象
			if (JKKModelCommon.isFutureDate(retMsgIdo.getString(KK1681ETMsg.RSV_APLY_YMD), JKKModelCommon.getOpeDate(inCBSMsg), "0"))
			{
				// 1件のみの想定
				retMsgIdo.set(KK1681ETMsg.RSV_APLY_YMD, staYmd);
				retMsgIdo.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
				retMsgIdo.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

				// 更新処理
				update(inCBSMsg, retMsgIdo);
			}
		}
	}

	/**
	 * <p>
	 * 更新処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inETMsg 登録用のETMsg
	*/
	private void update(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inCBSMsg);
		dbaUtil.update(inETMsg);
	}


	/**
	 * <p>
	 * サービス契約番号に紐付く、全てのオプションサービス契約のカレントの取得を行います。
	 * </p>
	 * @param  svcKeiNo サービス契約番号
	 * @param  opeDate 運用日付
	 * @return サービス契約番号に紐付くオプションサービス契約のカレントレコードの配列
	 */
	private CAANMsg[] findByALLCurKK0351BySvc(String svcKeiNo, String opeDate)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK0351ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();

			sql_Buff.append(" SELECT ");
			sql_Buff.append("     KK0351.OP_SVC_KEI_NO ");
			sql_Buff.append(" FROM ");
			sql_Buff.append("    ( ");
			sql_Buff.append("     SELECT * FROM KK_T_OP_SVC_KEI KK0351_01 ");
			sql_Buff.append("     WHERE ");
			sql_Buff.append("         KK0351_01.SVC_KEI_NO = ? ");
			sql_Buff.append("     AND (KK0351_01.OP_SVC_KEI_NO, KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) = ");
			sql_Buff.append("         (SELECT KK0351_01_GENE.OP_SVC_KEI_NO, MAX(KK0351_01_GENE.RSV_APLY_YMD || KK0351_01_GENE.GENE_ADD_DTM) AS KK0351_01_MAX ");
			sql_Buff.append("          FROM   KK_T_OP_SVC_KEI KK0351_01_GENE ");
			sql_Buff.append("          WHERE  KK0351_01_GENE.OP_SVC_KEI_NO = KK0351_01.OP_SVC_KEI_NO ");
			sql_Buff.append("          AND    KK0351_01_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND    KK0351_01_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND    KK0351_01_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0351_01_GENE.OP_SVC_KEI_NO) ");
			sql_Buff.append("     UNION ");
			sql_Buff.append("     SELECT * FROM KK_T_OP_SVC_KEI KK0351_02 ");
			sql_Buff.append("     WHERE ");
			sql_Buff.append("         EXISTS (SELECT ");
			sql_Buff.append("                     1 ");
			sql_Buff.append("                 FROM ");
			sql_Buff.append("                     KK_T_SVC_KEI_UCWK KK0161 ");
			sql_Buff.append("                 WHERE ");
			sql_Buff.append("                     KK0161.SVC_KEI_NO = ? ");
			sql_Buff.append("                     AND KK0161.SVC_KEI_UCWK_NO = KK0351_02.SVC_KEI_UCWK_NO ");
			sql_Buff.append("                     AND (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) = ");
			sql_Buff.append("                         (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX ");
			sql_Buff.append("                         FROM   KK_T_SVC_KEI_UCWK KK0161_GENE ");
			sql_Buff.append("                         WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ");
			sql_Buff.append("                         AND    KK0161_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("                         AND    KK0161_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("                         AND    KK0161_GENE.MK_FLG = '0' ");
			sql_Buff.append("                         GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO)) ");
			sql_Buff.append("     AND (KK0351_02.OP_SVC_KEI_NO, KK0351_02.RSV_APLY_YMD || KK0351_02.GENE_ADD_DTM) = ");
			sql_Buff.append("         (SELECT KK0351_02_GENE.OP_SVC_KEI_NO, MAX(KK0351_02_GENE.RSV_APLY_YMD || KK0351_02_GENE.GENE_ADD_DTM) AS KK0351_02_MAX ");
			sql_Buff.append("          FROM   KK_T_OP_SVC_KEI KK0351_02_GENE ");
			sql_Buff.append("          WHERE  KK0351_02_GENE.OP_SVC_KEI_NO = KK0351_02.OP_SVC_KEI_NO ");
			sql_Buff.append("          AND    KK0351_02_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND    KK0351_02_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND    KK0351_02_GENE.MK_FLG = '0' ");
			sql_Buff.append("          GROUP BY KK0351_02_GENE.OP_SVC_KEI_NO) ");
			sql_Buff.append("    ) KK0351");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), sql_Buff);

			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, opeDate);
			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 3, svcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 4, opeDate);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 5, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 返却用リスト
			ArrayList<CAANMsg> retArray = new ArrayList<CAANMsg>();

			// 結果の設定
			while (rsltQuery.next())
			{
				CAANMsg retMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
				retMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, rsltQuery.getString(KK0351ETMsg.OP_SVC_KEI_NO));
				retArray.add(retMsgKK0351);
			}

			return retArray.toArray(new CAANMsg[0]);
		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}
	
	/**
	 * <p>
	 * オプションサービス契約の項目の設定を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0351curMsg オプションサービス契約のメッセージ
	 * @return 編集後のオプションサービス契約のメッセージ
	 */
	private CAANMsg setOpSvcKeiColumn(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0351curMsg)
	{
		// サービス開始年月日の取得
		String svcStaymd = getSvcStaymdOfOpSvcKei(inCBSMsg, inContext, kk0351curMsg);
		if (null == svcStaymd)
		{
			throw new JKKejbBusinessException("開始日設定(オプションサービス)の相関ルールの結果、日付を取得できませんでした。");
		}
		// サービス課金開始年月日の取得
		String svcChrgStaymd = getSvcChrgStaymdOfOpSvcKei(inCBSMsg, inContext, kk0351curMsg, svcStaymd);
		if (null == svcChrgStaymd)
		{
			throw new JKKejbBusinessException("課金開始日設定(オプション)の相関ルールの結果、日付を取得できませんでした。");
		}

		kk0351curMsg.set(KK0351ETMsg.PLAN_STAYMD, svcStaymd);
		kk0351curMsg.set(KK0351ETMsg.PLAN_CHRG_STAYMD, svcChrgStaymd);
		kk0351curMsg.set(KK0351ETMsg.SVC_STAYMD, svcStaymd);
		kk0351curMsg.set(KK0351ETMsg.SVC_CHRG_STAYMD, svcChrgStaymd);
		kk0351curMsg.set(KK0351ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0351curMsg.set(KK0351ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		return kk0351curMsg;
	}

	/**
	 * <p>
	 * オプションサービス契約のサービス課金開始年月日を、ルールを元に算出して返却します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0351curMsg カレントレコード
	 * @param staYmd サービス開始年月日
	 * @return 算出されたサービス課金開始年月日
	*/
	private String getSvcChrgStaymdOfOpSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0351curMsg, String staYmd)
	{

		String opSvcKeiNo = kk0351curMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
		
		// オプションサービス契約ETDA生成
		JKKejbKK0351ETDA opEtda = new JKKejbKK0351ETDA();
		// 課金開始日設定(オプション)相関ルール
		String chrgStaYmd = opEtda.execSokanOfChrgStaYmd(inCBSMsg, inContext, opSvcKeiNo, null, staYmd);

		return chrgStaYmd;
	}

	/**
	 * <p>
	 * オプションサービス契約に紐付く異動予約のDBアクセス処理を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param curRetMsg オプションサービス契約のカレントレコード
	 * </p>
	 */
	private void dbAccessIdoOfOpSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg curRetMsg)
	{
		String opSvcKeiNo = curRetMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO);

		// 異動予約の検索条件を設定
		CAANMsg conInMsg = new CAANMsg(KK1681ETMsg.class.getName());
		conInMsg.set(KK1681ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		conInMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDO_DTLCD_OP_START);
		conInMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDO_STATCD_IDORSV_OUT_TARGET);
		conInMsg.set(KK1681ETMsg.MK_FLG, MKFLG_VALID);

		// 異動予約更新処理の呼出し
		updIdoRsv(inCBSMsg, inContext, conInMsg, curRetMsg.getString(KK0351ETMsg.SVC_STAYMD));
	}

	/**
	 * <p>
	 * サブオプションサービス契約の項目の設定を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg サブオプションサービス契約のメッセージ
	 * @return inMsg 編集後のサブオプションサービス契約のメッセージ
	 * </p>
	 */
	private CAANMsg setSbOpSvcKeiColumn(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg)
	{
		// サービス開始年月日の取得
		String svcStaymd = getSvcStaymdOfSbOpSvcKei(inCBSMsg, inContext, inMsg);
		if (null == svcStaymd)
		{
			throw new JKKejbBusinessException("開始日設定(サブオプション)の相関ルールの結果、日付を取得できませんでした。");
		}
		// サービス課金開始年月日の取得
		String svcChrgStaymd = getSvcChrgStaymdOfSbOpSvcKei(inCBSMsg, inContext, inMsg, svcStaymd);
		if (null == svcChrgStaymd)
		{
			throw new JKKejbBusinessException("課金開始日設定(サブオプション)の相関ルールの結果、日付を取得できませんでした。");
		}

		inMsg.set(KK0401ETMsg.PLAN_STAYMD, svcStaymd);
		inMsg.set(KK0401ETMsg.PLAN_CHRG_STAYMD, svcChrgStaymd);
		inMsg.set(KK0401ETMsg.SVC_STAYMD, svcStaymd);
		inMsg.set(KK0401ETMsg.SVC_CHRG_STAYMD, svcChrgStaymd);
		inMsg.set(KK0401ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inMsg.set(KK0401ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		return inMsg;
	}

	/**
	 * <p>
	 * サブオプションサービス契約のサービス課金開始年月日を、ルールを元に算出して返却します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 当メソッド呼出し時の更新対象レコード
	 * @param staYmd サービス開始年月日
	 * @return 算出された課金開始年月日
	 */
	private String getSvcChrgStaymdOfSbOpSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg, String staYmd)
	{
		
		// サブオプションサービス契約ETDA生成
		JKKejbKK0401ETDA sbopEtda = new JKKejbKK0401ETDA();
		
		String opSvcKeiNo = inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO);
		String sbopSvcKeiNo = inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);
		
		// 開始日設定(サブオプションサービス)相関ルール
		String svcCrgStaymd = sbopEtda.execSokanOfChrgStaYmd(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo, null, staYmd);
		
		return svcCrgStaymd;
	}

	/**
	 * <p>
	 * サービス契約_課金開始日算出
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 当メソッド呼出し時の更新対象レコード
	 * @param staYmd サービス開始年月日
	 * @return 算出されたサービス課金開始年月日
	 */
	private String getSvcChrgStaymdOfSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg, String staYmd)
	{

		// 料金グループのカレントレコードを取得
		CAANMsg ret0781 = getCurrentKK0781(inCBSMsg, inMsg.getString(KK0081ETMsg.PRC_GRP_CD));

		// 開始日設定(サービス)の相関ルール部品呼び出し
		JKKejbRule0065001 rule0065 = new JKKejbRule0065001(inCBSMsg);

		// パラメータ設定
		rule0065.setIdo_div(inMsg.getString(KK0081ETMsg.IDO_DIV));
		rule0065.setSvc_cd(inMsg.getString(KK0081ETMsg.SVC_CD));
		rule0065.setPrc_grp_cd(inMsg.getString(KK0081ETMsg.PRC_GRP_CD));
		rule0065.setKaisen_tk_comp_cd(ret0781.getString(KK0781ETMsg.KAISEN_TK_COMP_CD));
		rule0065.setMskm_dtl_no(inMsg.getString(KK0081ETMsg.MSKM_DTL_NO));
		rule0065.setSvc_sta_ymd(staYmd);
		String doujiMskm = getInsvcDojiMskmUm(inCBSMsg, inMsg.getString(KK0081ETMsg.MSKM_DTL_NO));
		rule0065.setInsvc_doji_mskm_um(doujiMskm);
		// ANK-2423-00-00 ADD START
		rule0065.setKoji_um(inCBSMsg.getString(EKK0081C013CBSMsg.KOJI_UM));
		// ANK-2423-00-00 ADD END
		

		// ルールの呼び出し
		String chrgStaYmd = rule0065.getChrgStaYmd();

		return chrgStaYmd;
	}
	
	/**
	 * <p>
	 * サービス契約内訳_サービス開始年月日算出
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 当メソッド呼出し時の更新対象レコード
	 * @return 算出されたサービス開始年月日
	 */
	private String getStaYmdUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg)
	{

		String staYmd = null; // 開始年月日
		String svcKeiNo = inMsg.getString(KK0161ETMsg.SVC_KEI_NO);
		// 親サービス契約のカレントレコードを取得
		CAANMsg kk0081Msg = getCurrentSvcKei(inCBSMsg, inContext, svcKeiNo);

		String prcGrpCd = kk0081Msg.getString(KK0081ETMsg.PRC_GRP_CD);
		// 親契約のサービス契約カレントレコードに設定されている料金グループを取得
		CAANMsg kk0781Msg = getCurrentKK0781(inCBSMsg, prcGrpCd);

		if(JKKModelConst.PRC_GRP_CD_EOHTL.equals(prcGrpCd))
		{
			// 料金グループコードがeo光電話の場合

			// サービス契約内訳<eo光電話>の全件カレントレコードを取得
			CAANMsg[] ret0191List = getAllCurrentKK0191(inCBSMsg, inMsg.getString(KK0161ETMsg.SVC_KEI_NO));

			// 開始年月日保持用リスト
			ArrayList<String> arrayStaYmd = new ArrayList<String>();

			for (int i = 0; i < ret0191List.length; i++)
			{
				// 相関ルールの呼び出す為にインスタンス生成
				JKKejbRule0073001 instance = new JKKejbRule0073001(inCBSMsg);
				
				instance.setSvc_cd(kk0081Msg.getString(KK0081ETMsg.SVC_CD));
				instance.setKaisen_tk_comp_cd(kk0781Msg.getString(KK0781ETMsg.KAISEN_TK_COMP_CD));
				instance.setPrc_grp_cd(prcGrpCd);
				instance.setBmp_um(ret0191List[i].getString(KK0191ETMsg.BMP_UM)); 
				instance.setIdo_div(inCBSMsg.getString(EKK0081C013CBSMsg.IDO_DIV));
				instance.setSvc_kei_no(svcKeiNo);
				instance.setSvc_kei_ucwk_no(inMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO));
				instance.setMskm_dtl_no(inMsg.getString(KK0161ETMsg.MSKM_DTL_NO));
				instance.setSvc_use_sta_kibo_ymd(inMsg.getString(KK0161ETMsg.SVC_USE_STA_KIBO_YMD));
				instance.setShosa_ymd(inMsg.getString(KK0161ETMsg.SHOSA_YMD));
				instance.setRsv_aply_ymd(inMsg.getString(KK0161ETMsg.RSV_APLY_YMD));
				instance.setSvc_sta_ymd(inCBSMsg.getString(EKK0081C013CBSMsg.SVC_STA_YMD));
				
				// ANK-2423-00-00 ADD START
				instance.setKoji_um(inCBSMsg.getString(EKK0081C013CBSMsg.KOJI_UM));
				// ANK-2423-00-00 ADD END
				
				// ルールの呼び出し
				String staDate = instance.getStaYmd();

				// 取得した開始日がnullでない場合は、リストに保持する
				if (null != staDate) 
				{
					arrayStaYmd.add(instance.getStaYmd());
				}
			}
			
			// 取得した開始日の個数分処理を行う
			for (int i = 0; i < arrayStaYmd.size(); i++)
			{
				// 1件目の場合は値をそのまま開始日に設定する
				if (i == 0)
				{
					staYmd = arrayStaYmd.get(i);
					continue;
				}
	
				// 現在設定される開始日より、リストの開始日が大きい場合、
				// リストの開始日を開始日とする
				if (staYmd.compareTo(arrayStaYmd.get(i)) < 0)
				{
					staYmd = arrayStaYmd.get(i);
				}
			}
			
			// 開始年月日が取得できなかった場合、エラー処理を行う。
			if(null == staYmd || "".equals(staYmd))
			{
				throw new JKKejbBusinessException();  
			}
		}
		else
		{
			// 相関ルールの呼び出す為にインスタンス生成
			JKKejbRule0073001 instance = new JKKejbRule0073001(inCBSMsg);
			
			instance.setSvc_cd(kk0081Msg.getString(KK0081ETMsg.SVC_CD));
			instance.setKaisen_tk_comp_cd(kk0781Msg.getString(KK0781ETMsg.KAISEN_TK_COMP_CD));
			instance.setPrc_grp_cd(prcGrpCd);
			instance.setIdo_div(inCBSMsg.getString(EKK0081C013CBSMsg.IDO_DIV));
			instance.setSvc_kei_no(svcKeiNo);
			instance.setSvc_kei_ucwk_no(inMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO));
			instance.setMskm_dtl_no(inMsg.getString(KK0161ETMsg.MSKM_DTL_NO));
			instance.setSvc_use_sta_kibo_ymd(inMsg.getString(KK0161ETMsg.SVC_USE_STA_KIBO_YMD));
			instance.setShosa_ymd(inMsg.getString(KK0161ETMsg.SHOSA_YMD));
			instance.setSvc_sta_ymd(inCBSMsg.getString(EKK0081C013CBSMsg.SVC_STA_YMD));
			
			// ANK-2423-00-00 ADD START
			instance.setKoji_um(inCBSMsg.getString(EKK0081C013CBSMsg.KOJI_UM));
			// ANK-2423-00-00 ADD END
			
			// ルールの呼び出し
			staYmd = instance.getStaYmd();
			
			// 開始年月日が取得できなかった場合、エラー処理を行う。
			if(null == staYmd || "".equals(staYmd))
			{
				return null; 
			}
			
		}
		
		// 相関ルールの結果を返却する
		return staYmd;
	}
	
	/**
	 * <p>
	 * サービス契約内訳_課金開始年月日算出
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 当メソッド呼出し時の更新対象レコード
	 * @param staYmd サービス開始年月日
	 * @return 算出されたサービス課金開始年月日
	 */
	private String getSvcChrgStaymdOfSvcKeiUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg, String staYmd)
	{

		String svcKeiNo = inMsg.getString(KK0161ETMsg.SVC_KEI_NO);
		// 親サービス契約のカレントレコードを取得
		CAANMsg kk0081Msg = getCurrentSvcKei(inCBSMsg, inContext, svcKeiNo);

		String prcGrpCd = kk0081Msg.getString(KK0081ETMsg.PRC_GRP_CD);
		// 親契約のサービス契約カレントレコードに設定されている料金グループを取得
		CAANMsg kk0781Msg = getCurrentKK0781(inCBSMsg, prcGrpCd);

		// 相関ルールの呼び出す為にインスタンス生成
		JKKejbRule0065001 instance = new JKKejbRule0065001(inCBSMsg);

		instance.setIdo_div(inCBSMsg.getString(EKK0081C013CBSMsg.IDO_DIV));
		instance.setSvc_cd(kk0081Msg.getString(KK0081ETMsg.SVC_CD));
		instance.setPrc_grp_cd(kk0081Msg.getString(KK0081ETMsg.PRC_GRP_CD));
		instance.setChrg_sta_ymd_hosei_um(kk0081Msg.getString(KK0081ETMsg.CHRG_STA_YMD_HOSEI_UM));
		instance.setMskm_dtl_no(inMsg.getString(KK0161ETMsg.MSKM_DTL_NO));
		instance.setKaisen_tk_comp_cd(kk0781Msg.getString(KK0781ETMsg.KAISEN_TK_COMP_CD));
		instance.setSvc_sta_ymd(staYmd);
		String doujiMskm = getInsvcDojiMskmUm(inCBSMsg, inMsg.getString(KK0081ETMsg.MSKM_DTL_NO));
		instance.setInsvc_doji_mskm_um(doujiMskm);
		
		// ANK-2423-00-00 ADD START
		instance.setKoji_um(inCBSMsg.getString(EKK0081C013CBSMsg.KOJI_UM));
		// ANK-2423-00-00 ADD END
		
		// 相関ルールの結果を返却する
		return instance.getChrgStaYmd();
	}
	
	/**
	 * <p>
	 * オプションサービス契約_開始日設定(オプションサービス)
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0351curMsg カレントレコード
	 * @return 算出されたサービス開始年月日
	 */
	private String getSvcStaymdOfOpSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0351curMsg)
	{
		// オプションサービス契約ETDA生成
		JKKejbKK0351ETDA opEtda = new JKKejbKK0351ETDA();
		String opSvcKeiNo = kk0351curMsg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
		// 開始日設定(オプションサービス)相関ルール
		String staYmd = opEtda.execSokanOfStaYmd(inCBSMsg, inContext, opSvcKeiNo, SVCCD_INTERNET, null);
		
		return staYmd;
	}
	
	/**
	 * <p>
	 * サブオプションサービス契約_開始日設定(サブオプションサービス)
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 当メソッド呼出し時の更新対象レコード
	 * @return 算出されたサービス課金開始年月日
	 */
	private String getSvcStaymdOfSbOpSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg)
	{

		// サブオプションサービス契約ETDA生成
		JKKejbKK0401ETDA sbopEtda = new JKKejbKK0401ETDA();

		String opSvcKeiNo = inMsg.getString(KK0401ETMsg.OP_SVC_KEI_NO);
		String sbopSvcKeiNo = inMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);

		// 開始日設定(サブオプションサービス)相関ルール
		String staYmd = sbopEtda.execSokanOfStaYmd(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo, null);

		return staYmd;
	}
	
	/**
	 * <p>
	 * <p>
	 * 機器提供サービス契約のサービス開始年月日をルールを、元に算出して返却します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 当メソッド呼出し時の更新対象レコード
	 * @return 算出されたサービス開始年月日
	 * @return
	 */
	private String getSvcStaymdOfKktkSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg)
	{
		// 相関ルールの呼び出す為にインスタンス生成する
		JKKejbRule0075001 instance = new JKKejbRule0075001(inCBSMsg);
						
		// サービス契約のカレントレコードを取得
		CAANMsg ret0081 = getCurrentSvcKei(inCBSMsg, inContext, inCBSMsg.getString(EKK0081C013CBSMsg.SVC_KEI_NO));

		// サービスコードを設定する
		instance.setSvc_cd(ret0081.getString(KK0081ETMsg.SVC_CD));
		
		// 機器提供サービスコードを設定する
		instance.setKktk_svc_cd(inMsg.getString(KK0341ETMsg.KKTK_SVC_CD));
		
		// 異動区分を設定する
		instance.setIdo_div(inCBSMsg.getString(EKK0081C013CBSMsg.IDO_DIV));
						
		// サービス開始年月日(サービス契約)を設定する
		instance.setKk0081_svc_sta_ymd(ret0081.getString(KK0081ETMsg.SVC_STA_YMD));
		
		// サービス利用開始希望年月日を設定する
		instance.setSvc_use_sta_kibo_ymd(inMsg.getString(KK0341ETMsg.SVC_USE_STA_KIBO_YMD));
		
		// 機器提供サービス契約番号を設定する
		instance.setKktk_svc_kei_no(inMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO));
		
		// 機器変更番号を設定する
		instance.setKiki_Chg_No(inMsg.getString(KK0341ETMsg.KIKI_CHG_NO));
		
		// 申込明細番号を設定する
		instance.setMskm_dtl_no(inMsg.getString(KK0341ETMsg.MSKM_DTL_NO));
		
		// 料金計算日より求めた請求年月の末日を設定する
		String ch0501_seiky_ymd = this.getCH0501SeikyYmd(inCBSMsg, inContext);
		if (ch0501_seiky_ymd == null)
		{
			return null;
		}
		// 申込明細番号を設定する
		instance.setCh0501_seiky_ymd(ch0501_seiky_ymd);
		
		// ルールを実行する
		return instance.getStaYmd();
	}

	/**
	 * <p>
	 * 料金計算日より求めた請求年月に末日を付与して返却します
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 請求年月の末日
	 * </p>
	 */
	private String getCH0501SeikyYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0501ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     CH0501.SEIKY_YM AS SEIKY_YM ")
					.append(" FROM ")
					.append("     CH_M_PRC_SCHDL_TEIGI CH0501 ")
					.append(" WHERE ")
					.append("         CH0501.EVENT_CD = '03' ")
					.append("     AND CH0501.EVENT_YMD= ")
					.append("         (SELECT MAX(CH0501_MAX.EVENT_YMD)  ")
					.append("            FROM CH_M_PRC_SCHDL_TEIGI CH0501_MAX  ")
					.append("           WHERE CH0501_MAX.MK_FLG = '0'  ")
					.append("             AND CH0501_MAX.EVENT_CD = CH0501.EVENT_CD ")
					.append("             AND CH0501_MAX.EVENT_YMD <= ? ")
					.append("         ) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 1, JKKModelCommon.getOpeDate(inCBSMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索結果が0件の場合
			if (rsltQuery == null)
			{
				return null;
			}

			String seikyYm = null;

			// 請求年月を取得する
			if (rsltQuery.next())
			{
				seikyYm = rsltQuery.getString("SEIKY_YM");
			}
			
			// 請求年月を元に末日を付与して返却します
			return seikyYm.concat(JPCDateUtil.getEndOfMonth(seikyYm));
		}
		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);
			}
		}
	}

	/**
	 * <p>
	 * インターネットサービス同時申込有無の設定値を取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param mskmDtlNo 申込明細番号
	 * @return インターネットサービス同時申込有無
	 */
	private String getInsvcDojiMskmUm(CAANMsg inCBSMsg, String mskmDtlNo)
	{
		// 申込明細のカレントレコードを取得
		CAANMsg ret0021 = getCurrentKK0021(inCBSMsg, mskmDtlNo);

		// 申込番号に紐付くサービス契約の全件を取得
		CAANMsg[] ret0081All = new JKKejbEditUtil().getCurKK0081WithMskm(inCBSMsg, ret0021.getString(KK0021ETMsg.MSKM_NO));

		// 取得したサービス契約の件数分処理を行う
		for (int j = 0; j < ret0081All.length; j++)
		{
			// サービスコードが「インターネットサービス」のレコードが存在した場合、
			// 同時申込有りを返却する
			if (JKKModelConst.SVC_CD_NET.equals(ret0081All[j].getString(KK0081ETMsg.SVC_CD)))
			{
				return JKKModelConst.NET_DOUJI_ARI;
			}
		}

		// サービスコードが「インターネットサービス」のレコードが存在しなかった場合、
		// 同時申込無しを返却する
		return JKKModelConst.NET_DOUJI_NASHI;
	}
	
	/**
	 * <p>
	 * 申込明細のカレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param mskmDtlNo 申込明細番号
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0021(CAANMsg inCBSMsg, String mskmDtlNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0021ETMsg.class.getName());
		inETMsg.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);

		// 申込明細のカレント検索を行う
		return new JKKejbKK0021DBABase().findByCurrent(inETMsg);
	}
	
	/**
	 * <p>
	 * サービス契約番号に紐付くサービス契約内訳<eo光電話>の全件カレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo サービス契約番号
	 * @return 検索結果のレコード配列
	 */
	private CAANMsg[] getAllCurrentKK0191(CAANMsg inCBSMsg, String svcKeiNo)
	{
		// 全件検索用のメッセージを作成
		CAANMsg inETMsgCnd = new CAANMsg(KK0161ETMsg.class.getName());
		inETMsgCnd.set(KK0161ETMsg.SVC_KEI_NO, svcKeiNo);
		inETMsgCnd.set(KK0161ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

		// サービス契約内訳の全件検索を行う
		CAANMsg[] ret0161Cnd = null;

		try
		{
			ret0161Cnd = new KK0161LE().findByCondition(inETMsgCnd);
		}
		catch(CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// カレント取得結果の保持用リスト
		ArrayList<CAANMsg> array = new ArrayList<CAANMsg>();

		// 処理済キー保持用HashMap
		HashMap<String, String> hash = new HashMap<String, String>();
		
		// サービス契約の取得件数分処理を行う
		for (int i = 0; i < ret0161Cnd.length; i++)
		{
			// サービス契約内訳番号の取得
			String svcKeiUcwkNo = ret0161Cnd[i].getString(KK0161ETMsg.SVC_KEI_UCWK_NO);
			
			// 処理済のサービス契約内訳番号は処理しない
			if (hash.containsKey(svcKeiUcwkNo))
			{
				continue;
			}

			// 処理済のサービス契約内訳番号をHashMapに保持する
			hash.put(svcKeiUcwkNo, svcKeiUcwkNo);

			// 対象のサービス内訳契約番号でカレント検索を行う
			CAANMsg ret0161 = getCurrentKK0161(inCBSMsg, svcKeiUcwkNo);

			// カレントが存在しない場合は次の明細へ
			if (null == ret0161)
			{
				continue;
			}
			
			// 対象のサービス内訳契約番号でサービス契約内訳<eo光電話>の一意検索を行う
			CAANMsg ret0191 = getPrimaryKK0191(ret0161);

			// レコードが存在しない場合は次の明細へ
			if (null == ret0191)
			{
				continue;
			}
			
			array.add(ret0191);

		}
		
		// カレント検索の結果をリストからCAANMsgの配列へ置換する
		CAANMsg[] retMsg = new CAANMsg[array.size()];

		for (int i = 0; i < array.size(); i++)
		{
			retMsg[i] = array.get(i);
		}

		return retMsg;
	}
	
	/**
	 * <p>
	 * サービス契約内訳のカレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0161(CAANMsg inCBSMsg, String svcKeiUcwkNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0161ETMsg.class.getName());
		inETMsg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		inETMsg.set(KK0161ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// サービス契約内訳のカレント検索を行う
		return new JKKejbKK0161DBABase().findByCurrent(inETMsg);
	}

	/**
	 * <p>
	 * サービス契約内訳<eo光電話>の一意検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @return 検索結果のレコード
	 */
	private CAANMsg getPrimaryKK0191(CAANMsg inCBSMsg)
	{
		// 一意検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0191ETMsg.class.getName());
		inETMsg.set(KK0191ETMsg.SVC_KEI_UCWK_NO, inCBSMsg.getString(KK0191ETMsg.SVC_KEI_UCWK_NO));
		inETMsg.set(KK0191ETMsg.GENE_ADD_DTM, inCBSMsg.getString(KK0191ETMsg.GENE_ADD_DTM));

		// サービス契約内訳<eo光電話>の一意検索を行う
		return new JKKejbKK0191DBABase().findByPrimaryKey(inETMsg);
	}
	
	/**
	 * <p>
	 * 機器オプションサービス契約DBアクセス処理を行います
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * </p>
	 */
	private void dbAccessKkopSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String svcKeiNo = inCBSMsg.getString(EKK0081C013CBSMsg.SVC_KEI_NO);
		if (null == svcKeiNo)
		{
			return;
		}

		// サービス契約カレント取得
		CAANMsg curRetMsg = getCurrentSvcKei(inCBSMsg, inContext, svcKeiNo);

		String svc_cd = curRetMsg.getString(KK0081ETMsg.SVC_CD);		
		String svcStaYmd  = curRetMsg.getString(KK0081ETMsg.SVC_STA_YMD);
		String svcChrgStaYmd = curRetMsg.getString(KK0081ETMsg.SVC_CHRG_STAYMD);
		
		// サービス契約番号に紐付くレコードを取得
		CAANMsg conInMsg = new CAANMsg(KK0341ETMsg.class.getName());
		conInMsg.set(KK0341ETMsg.SVC_KEI_NO, svcKeiNo);
		conInMsg.set(KK0341ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] conRetMsg = null;
		try
		{
			conRetMsg = new KK0341LE().findByCondition(conInMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// サービス契約番号に紐付く機器提供サービス契約が存在する場合
		if (0 < conRetMsg.length)
		{
			kkopSvcKeiFromSvcKeiNo(inCBSMsg, inContext, conRetMsg ,svc_cd , svcStaYmd, svcChrgStaYmd);
			
		}
		CAANMsg[] kaisenUcwkRecords =  getValidSvcKeiKaisenUcwk(inCBSMsg, inContext, svcKeiNo);
			
		// 有効な回線対象サービス契約が存在する場合
		if (null != kaisenUcwkRecords && 0 < kaisenUcwkRecords.length)
		{
			for (CAANMsg kaisenUcwkRecord : kaisenUcwkRecords)
			{
				String kaisenUcwkNo = kaisenUcwkRecord.getString(KK0241ETMsg.SVC_KEI_KAISEN_UCWK_NO);

				// サービス契約回線内訳番号に紐付くレコードを取得
				CAANMsg conInMsgKK0341 = new CAANMsg(KK0341ETMsg.class.getName());
				conInMsgKK0341.set(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO, kaisenUcwkNo);
				conInMsgKK0341.set(KK0341ETMsg.MK_FLG, MKFLG_VALID);
				CAANMsg[] conRetMsgKK0341 = null;
				try
				{
					conRetMsgKK0341 = new KK0341LE().findByCondition(conInMsgKK0341);
				}
				catch (CAANException ce)
				{
					throw new CAANRuntimeException(ce);
				}
				
				kkopSvcKeiFromSvcKeiNo(inCBSMsg, inContext, conRetMsgKK0341 ,svc_cd , svcStaYmd, svcChrgStaYmd);
			}
		}
	}
	
	/**
	 * <p>
	 * サービス契約番号に紐付く機器提供サービス契約DBアクセス処理を行います
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kktkSvcKeiRecords サービス契約番号に紐付く機器提供サービス契約のレコード
	 * </p>
	 */
	private void kkopSvcKeiFromSvcKeiNo(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg[] kktkSvcKeiRecords, String svc_cd , String svcStaYmd , String svcChrgStaYmd)
	{
		if(kktkSvcKeiRecords == null) {
			return;
		}

		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		// サービス契約のサービスコードがネットか電話でない場合、処理はしない。
		if(!JKKModelConst.SVC_CD_NET.equals(svc_cd) && !JKKModelConst.SVC_CD_TEL.equals(svc_cd) )
		{
			return;
		}
		
		HashMap<String, String> escapeMap = new HashMap<String, String>();

		for(CAANMsg KK0341Msg : kktkSvcKeiRecords) {
			String kktksvckeino = KK0341Msg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);
			String kktksvccd = KK0341Msg.getString(KK0341ETMsg.KKTK_SVC_CD);
			
			if(!escapeMap.containsKey(kktksvckeino)) {
// #83846 MOD START
				//if(!JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kktksvccd)) {
				if(!JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kktksvccd) 
						&& !JKKModelConst.KKTK_SVC_CD_HGW.equals(kktksvccd)) {
// #83846 MOD END
					// OM-2015-0002488 20151208 ADD START
					// 多機能でもタブレットでもない場合は次のレコードを参照する
					if(!JKKModelConst.KKTK_SVC_CD_TABLET.equals(kktksvccd))
					{
					// OM-2015-0002488 20151208 ADD END
						continue;
					// OM-2015-0002488 20151208 ADD START
					}
					// OM-2015-0002488 20151208 ADD END
				}
				String searchPtn = "";
				
				if(JKKModelConst.SVC_CD_NET.equals(svc_cd)) {
					searchPtn = "2";
				} else {
					searchPtn = "3";				
					
				}
				// OM-2015-0002488 20151208 ADD START
				// ネットかつタブレットの場合は検索パターンに4を設定
				if(JKKModelConst.SVC_CD_NET.equals(svc_cd) && JKKModelConst.KKTK_SVC_CD_TABLET.equals(kktksvccd))
				{
					searchPtn = "4";
				}
				// OM-2015-0002488 20151208 ADD END
					
				HashMap<String, String> escapeMapkk2811 = new HashMap<String, String>();
				CAANMsg[] KK2811MsgList = new JKKejbKK2811DBABase().getKK2811byKktk(kktksvckeino, null, opeDate, searchPtn);
	
				for(CAANMsg kk2811Msg : KK2811MsgList) {
					String primaryKey = kk2811Msg.getString(KK2811ETMsg.KKOP_SVC_KEI_NO);

					if(!escapeMapkk2811.containsKey(primaryKey)) {
						// カレント検索
						CAANMsg curInMsg = new CAANMsg(KK2811ETMsg.class.getName());
						curInMsg.set(KK2811ETMsg.KKOP_SVC_KEI_NO, primaryKey);
						curInMsg.set(KK2811ETMsg.RSV_APLY_YMD, opeDate);
						CAANMsg curRetMsg = new JKKejbKK2811DBABase().findByCurrent(curInMsg);
						
						String stat = curRetMsg.getString(KK2811ETMsg.KKOP_SVC_KEI_STAT);
						
						// カレントの状態が"サービス提供中"の場合
						if (SVCKEI_STAT_TEIKYOU.equals(stat))
						{
							// OM-2015-0000134 2015/02/27 ADD START
							// 機器オプションサービス契約課金開始日の取得をルールより取得する
							svcChrgStaYmd = getSvcChrgStaymdOfKkopSvcKei(inCBSMsg, inContext, curRetMsg, svcStaYmd);
							if (null == svcChrgStaYmd)
							{
								throw new JKKejbBusinessException("課金開始日設定(機器オプションサービス契約)の相関ルールの結果、日付を取得できませんでした。");
							}
							// OM-2015-0000134 2015/02/27 ADD END
							
							// オプションサービス契約更新処理
							// メッセージの設定
							curRetMsg = setKkopSvcKeiColumn(inCBSMsg, inContext, curRetMsg , svcStaYmd, svcChrgStaYmd);
							// 更新処理
							update(inCBSMsg, curRetMsg);
						}
					}
				}
			}
		}
	}
		
	/**
	 * <p>
	 * 機器オプションサービス契約の項目の設定を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0351curMsg オプションサービス契約のメッセージ
	 * @param svcStaYmd　サービス契約のサービス開始年月日 
	 * @param svcStaYmd　サービス契約のサービス課金開始年月日 
	 * @return 編集後の 機器オプションサービス契約のメッセージ
	 */
	private CAANMsg setKkopSvcKeiColumn(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk2811curMsg , String svcStaYmd , String svcChrgStaYmd)
	{
	    // 他の処理では開始日を再算出しているが、機器オプションは算出ルールがないので、サービス契約に合わせる。
		kk2811curMsg.set(KK0351ETMsg.PLAN_STAYMD, svcStaYmd);
		kk2811curMsg.set(KK0351ETMsg.PLAN_CHRG_STAYMD, svcChrgStaYmd);
		kk2811curMsg.set(KK0351ETMsg.SVC_STAYMD, svcStaYmd);
		kk2811curMsg.set(KK0351ETMsg.SVC_CHRG_STAYMD, svcChrgStaYmd);
		kk2811curMsg.set(KK0351ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk2811curMsg.set(KK0351ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		return kk2811curMsg;
	}
	
	// OM-2015-0000134 2015/02/27 ADD START
	/**
	 * <p>
	 * 機器オプションサービス契約_課金開始年月日算出
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 当メソッド呼出し時の更新対象レコード
	 * @param staYmd サービス開始年月日
	 * @return 算出されたサービス課金開始年月日
	 */
	private String getSvcChrgStaymdOfKkopSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg,String staYmd)
	{
		// 相関ルールの呼び出す為にインスタンス生成
		JKKejbRule0091001 instance = new JKKejbRule0091001(inCBSMsg);

		instance.setIdo_div(inCBSMsg.getString(EKK0081C013CBSMsg.IDO_DIV));
		// 親サービスのサービス開始年月日（機器オプションのサービス開始は親に合わせる）
		instance.setKK2811Svc_sta_ymd(staYmd);
		// 機器オプションサービスコード
		instance.setKkop_svc_cd(inMsg.getString(KK2811ETMsg.KKOP_SVC_CD));
		// 更新契機を設定(「開始」を固定で設定)
		instance.setUpd_opty("1");
		// カレントのプラン課金開始年月日
		String chrgStaymd = inMsg.getString(KK2811ETMsg.PLAN_CHRG_STAYMD);
		// カレントのプラン課金終了年月日
		String chrgEndymd = inMsg.getString(KK2811ETMsg.PLAN_CHRG_ENDYMD);
		// 課金開始前／開始後
		instance.setChrg_sta_zengo(getChrgStaZengo(chrgStaymd, chrgEndymd));
		// 機器オプションサービス契約のカレントのサービス課金開始年月日（またはプラン課金開始年月日）
		instance.setKK2811Svc_chrg_sta_ymd(chrgStaymd);
		// 機器オプションサービス契約のカレントのサービス終了年月日（またはプラン課金終了年月日）
		instance.setKK2811Svc_end_ymd(chrgEndymd);
		
		// 相関ルールの結果を返却する
		return instance.getChrgStaYmd();
	}
	
	/**
	 * <p>
	 * 課金開始前／開始後を返却します。
	 * サービス課金開始年月日（またはプラン課金開始年月日）とサービス課金終了年月日(またはプラン課金終了年月日) を大小比較し、
	 * 課金開始前／開始後を決定。
	 * </p>
	 * @param chrgStaymd サービス課金開始年月日（またはプラン課金開始年月日）
	 * @param chrgEndymd サービス課金終了年月日(またはプラン課金終了年月日) 
	 * @return 課金開始前／開始後
	 */
	private String getChrgStaZengo(String chrgStaymd, String chrgEndymd)
	{

		// 課金開始前／開始後
		if (chrgStaymd != null && chrgEndymd != null && JKKModelCommon.isPastDate(chrgStaymd, chrgEndymd, "1"))
		{
			// 1:サービス課金開始年月日(またはプラン課金開始年月日) ≦ サービス課金終了年月日(またはプラン課金終了年月日) の場合
			return "1";
		}
		else
		{
			// 0:サービス課金開始年月日(またはプラン課金開始年月日) ＞ サービス課金終了年月日(またはプラン課金終了年月日) の場合
			return "0";
		}
	}
	// OM-2015-0000134 2015/02/27 ADD END
}