/*******************************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbKK0451SecProc
 *	ソースファイル名：JKKejbKK0451SecProc.java
 *	作成者			：EKek0017
 *	日付			：2011年03月14日
 *＜機能概要＞
 *	割引サービス契約に対する副次処理を行う部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *	v4.00.00	2013/04/17	FJ)沖田		IT1-2012-0000903
 *	v5.00.00	2013/07/09	FJ)寺園		LT-2013-0000321
 *	v6.00.00	2013/12/25	FJ)小島		OM-2013-0005081
 *	v7.00.00	2014/01/08	FJ)小島		IT1-2014-0000016
 *	v7.00.01	2014/02/14	FJ)松枝		OM-2014-0000690
 *	v8.00.00	2014/05/15	FJ)小島		OM-2014-0001784
 *	v8.00.01	2014/05/20	FJ)小島		OM-2014-0001784
 *	v9.00.01	2014/07/09	FJ)寺園		OM-2014-0002295
 * v10.00.00	2014/07/08	FJ)寺園		ANK-2135-00-00
 * v10.00.01	2014/07/30	FJ)寺園		ANK-2135-02-00
 * v13.00.00	2015/02/18	FJ)寺園		ANK-2348-00-00
 * v26.00.00	2016/08/23	FJ)中山		【OM-2016-0001938】休止解除・再休止受付によるセット割適用不正対応
 * v28.00.00    2016/11/24  FJ)寺園    【ANK-3047-00-00  】【OM-2016-2038】事象F セット割パターンNo29の改修対応
 * v28.00.01    2017/01/30  FJ)寺園    【ANK-3047-00-00  】【OM-2016-2038】事象F セット割パターンNo29の改修対応（再）
 * v50.00.00	2020/07/02	FJ)三原		【ANK-3754-00-00】トビラフォン対応
 *
 ********************************************************************************/

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 java.util.List;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANFinderException;
import com.fujitsu.futurity.model.base.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.constant.JKKStrConst;
import eo.common.util.JPCDateChecker;
import eo.common.util.JPCDateUtil;
import eo.ejb.cbm.entity.CH0501ETMsg;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0081LE;
import eo.ejb.cbm.entity.KK0451ETMsg;
import eo.ejb.cbm.entity.KK0451LE;
import eo.ejb.cbm.entity.KK0481ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK2361ETMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.entity.JKKejbIdoRsvAccess;

/**
* <p>
* 割引サービス契約に対する副次処理を行う部品です。
* </p>
* @author 富士通
*/
public class JKKejbKK0451SecProc extends JKKejbKK0451DBABase
{

	/**
	 * <p>
	 * 指定された割引サービス契約番号に紐付く予約の取消、および自動予約取消ワークの登録を行います。
	 * </p>
	 * @param wribSvcKeiNo 取り消し対象の割引サービス契約番号
	 * @param idoDiv 異動区分
	 * @param mskmDtlNo 申込明細番号
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 * @param geneDtm 世代登録年月日時分秒
	 * @param autoRsvClStatCd 自動予約取消状態コード("取消済"/"自動予約取消未実施"：予約取消を実施する/しない)
	 */
	public void cancelReserve(String wribSvcKeiNo, String idoDiv, String mskmDtlNo,
			String opeDate, String updDtm, String updOpeAct, String geneDtm, String autoRsvClStatCd)
	{
		// 割引サービス契約スキーマの予約取消
		
		// 予約検索用メッセージ作成
		CAANMsg inETMsg = new CAANMsg(KK0451ETMsg.class.getName());
		inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		inETMsg.set(KK0451ETMsg.RSV_APLY_YMD, opeDate);

		// 予約検索を行う
		CAANMsg[] retMsgList = super.findByReserve(inETMsg);

		// 取得した予約レコードを全て取り消す
		for (CAANMsg retMsg : retMsgList)
		{
			// 当サービスIFで作成した解約レコードは除外する
			if (geneDtm.equals(retMsg.getString(KK0451ETMsg.GENE_ADD_DTM)))
			{
				continue;
			}
			
			// 自動予約取消状態コードが"取消済"の場合のみ、予約取消実施
			if (JKKModelConst.AUTO_RSV_CL_STAT_CD_CL_ZM.equals(autoRsvClStatCd))
			{
				updateKK0451ClRsv(retMsg, opeDate, updDtm, updOpeAct);
			}
			// 自動予約取消ワークに登録します
			this.createKK2791GymSchema(retMsg, idoDiv, mskmDtlNo, updDtm, updOpeAct, autoRsvClStatCd);
		}

		// 異動予約スキーマの予約取消

		// 予約検索を行う
		List<CAANMsg> retList = new JKKejbIdoRsvAccess().getIdoRsvWribSvcKeiNo(wribSvcKeiNo, opeDate);

		// 予約レコードが存在した場合は取り消す
		for (CAANMsg retIdoRsv : retList)
		{
			// ただし、申込明細番号が同一のものは処理しない
			if (mskmDtlNo != null && !mskmDtlNo.equals(retIdoRsv.getString(KK1681ETMsg.MSKM_DTL_NO)))
			{
				// 自動予約取消状態コードが"取消済"の場合のみ、予約取消実施
				if (JKKModelConst.AUTO_RSV_CL_STAT_CD_CL_ZM.equals(autoRsvClStatCd))
				{
					new JKKejbKK1681SecProc().updateKK1681ClRsv(retIdoRsv, opeDate, updDtm, updOpeAct);
				}
				// 自動予約取消ワークに登録します
				this.createKK2791IdoRsv(retIdoRsv, idoDiv, mskmDtlNo, updDtm, updOpeAct, autoRsvClStatCd);
			}
		}
	}

	/**
	 * <p>
	 * 自動予約取消ワークに割引サービス契約の予約情報を登録します
	 * </p>
	 * @param kk0451EtMsg ETメッセージ
	 * @param idoDiv 異動区分
	 * @param mskmDtlNo 申込明細番号
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 * @param autoRsvClStatCd 自動予約取消状態コード
	 */
	private void createKK2791GymSchema(CAANMsg kk0451EtMsg, String idoDiv, String mskmDtlNo, String updDtm, String updOpeAct, String autoRsvClStatCd)
	{
		// 自動予約取消ワークＤＢ操作部品のインスタンス化
		JKKejbKK2791ETDA kk2791etda = new JKKejbKK2791ETDA();

		// 取消契機異動区分
		kk2791etda.setCl_opty_ido_div(idoDiv);
		// 取消契機申込明細番号
		kk2791etda.setCl_opty_mskm_dtl_no(mskmDtlNo);
		// 割引サービス契約番号
		kk2791etda.setWrib_svc_kei_no(kk0451EtMsg.getString(KK0451ETMsg.WRIB_SVC_KEI_NO));
		// 予約契機異動区分
		kk2791etda.setRsv_opty_ido_div(kk0451EtMsg.getString(KK0451ETMsg.IDO_DIV));
		// 予約契機申込明細番号
		kk2791etda.setRsv_opty_mskm_dtl_no(kk0451EtMsg.getString(KK0451ETMsg.MSKM_DTL_NO));
		// 予約適用年月日
		kk2791etda.setRsv_aply_ymd(kk0451EtMsg.getString(KK0451ETMsg.RSV_APLY_YMD));
		// 各種スキーマ世代登録年月日時分秒
		kk2791etda.setVari_schma_gene_add_dtm(kk0451EtMsg.getString(KK0451ETMsg.GENE_ADD_DTM));
		// 予約適用コード
		kk2791etda.setRsv_aply_cd(kk0451EtMsg.getString(KK0451ETMsg.RSV_APLY_CD));
		// 登録年月日時分秒
		kk2791etda.setAdd_dtm(updDtm);
		// 登録オペレータアカウント
		kk2791etda.setAdd_opeacnt(updOpeAct);
		// 更新年月日時分秒
		kk2791etda.setUpd_dtm(updDtm);
		// 更新オペレータアカウント
		kk2791etda.setUpd_opeacnt(updOpeAct);

		// 自動予約取消ワークの登録
		kk2791etda.createKK2791(kk0451EtMsg, "KK0451", autoRsvClStatCd);
	}

	/**
	 * <p>
	 * 自動予約取消ワークに異動予約の予約情報を登録します
	 * </p>
	 * @param kk1681EtMsg ETメッセージ
	 * @param idoDiv 異動区分
	 * @param mskmDtlNo 申込明細番号
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 * @param autoRsvClStatCd 自動予約取消状態コード
	 */
	private void createKK2791IdoRsv(CAANMsg kk1681EtMsg, String idoDiv, String mskmDtlNo, String updDtm, String updOpeAct, String autoRsvClStatCd)
	{
		// 自動予約取消ワークＤＢ操作部品のインスタンス化
		JKKejbKK2791ETDA kk2791etda = new JKKejbKK2791ETDA();

		// 取消契機異動区分
		kk2791etda.setCl_opty_ido_div(idoDiv);
		// 取消契機申込明細番号
		kk2791etda.setCl_opty_mskm_dtl_no(mskmDtlNo);
		// 登録年月日時分秒
		kk2791etda.setAdd_dtm(updDtm);
		// 登録オペレータアカウント
		kk2791etda.setAdd_opeacnt(updOpeAct);
		// 更新年月日時分秒
		kk2791etda.setUpd_dtm(updDtm);
		// 更新オペレータアカウント
		kk2791etda.setUpd_opeacnt(updOpeAct);

		// 自動予約取消ワークの登録
		kk2791etda.createKK2791(kk1681EtMsg, "KK1681", autoRsvClStatCd);
	}

	/**
	 * <p>
	 * 該当の「割引サービス契約」を回復(または解約取消)する際に、予約適用年月日が到来済の予約を取り消します。
	 * </p>
	 * @param wribSvcKeiNo 回復(または解約取消)対象の割引サービス契約番号
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	public void cancelReserveForKaihk(String wribSvcKeiNo, String opeDate, String updDtm, String updOpeAct)
	{
		// 予約検索を行う
		List<CAANMsg> kk1681MsgList = new JKKejbIdoRsvAccess().getIdoRsvWribSvcKeiNo(wribSvcKeiNo, opeDate);

		// 予約取消対象となる「異動予約」(予約適用年月日が到来済、かつ予約未反映)リスト
		JKKejbKK1681SecProc kk1681sp = new JKKejbKK1681SecProc();
		kk1681MsgList = kk1681sp.getIdoRsvForKaihkJiRsvCl(kk1681MsgList, opeDate);
		for (CAANMsg kk1681Msg : kk1681MsgList)
		{
			kk1681sp.updateKK1681ClRsv(kk1681Msg, opeDate, updDtm, updOpeAct);

			// 該当の予約と同時に作成された各種契約のインスタンスを削除する。
			kk1681sp.deleteInstanceForRsvCl(kk1681Msg, opeDate, updDtm, updOpeAct);
		}
	}

	/**
	 * 指定された割引サービス契約番号に紐付く、割引サービス契約スキーマの予約を取り消します。
	 * @param inMsg 予約検索の結果を保持するメッセージキャリア
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	private void updateKK0451ClRsv(CAANMsg inMsg, String opeDate, String updDtm, String updOpeAct)
	{
		// 更新用メッセージ作成
		CAANMsg inETMsg = new CAANMsg(KK0451ETMsg.class.getName());

		inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, inMsg.getString(KK0451ETMsg.WRIB_SVC_KEI_NO));
		inETMsg.set(KK0451ETMsg.GENE_ADD_DTM, inMsg.getString(KK0451ETMsg.GENE_ADD_DTM));
		inETMsg.set(KK0451ETMsg.RSV_CL_YMD, opeDate);
		inETMsg.set(KK0451ETMsg.RSV_APLY_CD, JKKModelConst.RSV_APLY_CD_RSV_CL);
		inETMsg.set(KK0451ETMsg.UPD_DTM, updDtm);
		inETMsg.set(KK0451ETMsg.UPD_OPEACNT, updOpeAct);

		// 更新を行う
		try
		{
			super.update(inETMsg);
		}
		catch (CAANFinderException cfe)
		{
			throw new CAANRuntimeException(cfe);
		}
	}

	/**
	 * <p>
	 * 指定された割引サービス契約番号に紐付く予約（該当の「割引サービス契約」レコードのうち、未来日での予約確定レコード）を解約します。
	 * </p>
	 * @param wribSvcKeiNo 解約対象の割引サービス契約番号
	 * @param opeDate 運用日付
	 * @param svcEndymd サービス終了年月日
	 * @param svcChrgEndymd サービス課金終了年月日
	 * @param svcDslYmd サービス解約年月日
	 * @param svcDlreCd サービス解約理由コード
	 * @param svcDlreMemo サービス解約理由メモ
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	public void dslRsvFixRec(String wribSvcKeiNo, String opeDate,
			String svcEndymd, String svcChrgEndymd, String svcDslYmd, String svcDlreCd, String svcDlreMemo, String updDtm, String updOpeAct)
	{
		/* ------------------------------------------------------------------------------------------------------------------------
		 * 予約中の強制解約、および住所変更予約中の解約の場合、回復時に予約情報を反映する必要があるため予約取消は行わない。
		 * ※ただし、未来日・予約確定レコードについては、予約適用年月日が到来した時点で、カレントレコードとなってしまうため、
		 *   以下の更新処理を行う。
		 * (1)予約解約(キャンセル)：解約時に予約レコードを"解約済"とする。
		 * (2)予約回復(キャンセル取消)：回復時に予約レコードを元のステータスに回復する。（現時点では、住所変更中の解約／回復に対してのみ実施する。）
		 * ------------------------------------------------------------------------------------------------------------------------ */
		
		// 該当の「割引サービス契約」レコードの予約確定レコードを取得する。
		CAANMsg inETMsg = new CAANMsg(KK0451ETMsg.class.getName());
		inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		inETMsg.set(KK0451ETMsg.RSV_APLY_CD, JKKModelConst.RSV_APLY_CD_RSV_FIX);
		inETMsg.set(KK0451ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

		CAANMsg[] retMsg = null;
		try
		{
			retMsg = new KK0451LE().findByCondition(inETMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// 予約解約実行
		for (int i = 0; i < retMsg.length; i++)
		{
			// 予約適用年月日＞運用日付の予約確定レコードのみ解約する。
			if (JKKModelCommon.isFutureDate(retMsg[i].getString(KK0451ETMsg.RSV_APLY_YMD), opeDate, "0"))
			{
				updateKK0451DslRsv(retMsg[i], svcEndymd, svcChrgEndymd, svcDslYmd, svcDlreCd, svcDlreMemo, updDtm, updOpeAct);
			}
		}
	}


	/**
	 * <p>
	 * 指定された割引サービス契約番号に紐付く、割引サービス契約スキーマの予約レコードを解約します。
	 * </p>
	 * @param inMsg 予約検索の結果を保持するメッセージキャリア
	 * @param svcEndymd サービス終了年月日
	 * @param svcChrgEndymd サービス課金終了年月日
	 * @param svcDslYmd サービス解約年月日
	 * @param svcDlreCd サービス解約理由コード
	 * @param svcDlreMemo サービス解約理由メモ
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	private void updateKK0451DslRsv(CAANMsg inMsg,
			String svcEndymd, String svcChrgEndymd, String svcDslYmd, String svcDlreCd, String svcDlreMemo, String updDtm, String updOpeAct)
	{
		// 更新用メッセージ作成
		CAANMsg inETMsg = new CAANMsg(KK0451ETMsg.class.getName());

		inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, inMsg.getString(KK0451ETMsg.WRIB_SVC_KEI_NO));
		inETMsg.set(KK0451ETMsg.GENE_ADD_DTM, inMsg.getString(KK0451ETMsg.GENE_ADD_DTM));
		// 割引サービス契約ステータス
		inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_STAT, JKKModelConst.SVC_KEI_STAT_DSL_ZM);
		// プラン終了年月日
		inETMsg.set(KK0451ETMsg.PLAN_ENDYMD, svcEndymd);
		// プラン課金終了年月日
		inETMsg.set(KK0451ETMsg.PLAN_CHRG_ENDYMD, svcChrgEndymd);
		// サービス終了年月日
		inETMsg.set(KK0451ETMsg.SVC_ENDYMD, svcEndymd);
		// サービス課金終了年月日
		inETMsg.set(KK0451ETMsg.SVC_CHRG_ENDYMD, svcChrgEndymd);
		// サービス解約年月日
		inETMsg.set(KK0451ETMsg.SVC_DSL_YMD, svcDslYmd);
		// サービス解約理由コード
		inETMsg.set(KK0451ETMsg.SVC_DLRE_CD, svcDlreCd);
		// サービス解約理由メモ
		inETMsg.set(KK0451ETMsg.SVC_DLRE_MEMO, svcDlreMemo);
		inETMsg.set(KK0451ETMsg.UPD_DTM, updDtm);
		inETMsg.set(KK0451ETMsg.UPD_OPEACNT, updOpeAct);
		
		// 更新を行う
		try
		{
			super.update(inETMsg);
		}
		catch (CAANFinderException cfe)
		{
			throw new CAANRuntimeException(cfe);
		}
	}
	
	/**
	 * <p>
	 * サービス契約に紐づくセット割引の割引対象契約サービス休止年月日、割引対象契約サービス休止解除年月日を更新します。
	 * また、電話パック割の場合も割引対象契約サービス休止年月日、割引対象契約サービス休止解除年月日を更新します。
	 * </p>
	 * @param inMsg 予約検索の結果を保持するメッセージキャリア
	 * @param svcKeiNo サービス契約番号
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	public void updateSetWribPauseYmd(CAANMsg inMsg, String svcKeiNo, String opeDate, String updDtm, String updOpeAct)
	{
		// 対象の割引サービス契約を取得
		CAANMsg[] st = getSetWribSvcKei(svcKeiNo, opeDate);
		
		for (CAANMsg wribSvcKei: st)
		{			
			// 休止課金開始年月日と休止解除年月日を設定
			CAANMsg inETMsg = getWribPauseYmd(wribSvcKei, opeDate);

			inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, wribSvcKei.getString(KK0451ETMsg.WRIB_SVC_KEI_NO));
			inETMsg.set(KK0451ETMsg.GENE_ADD_DTM, wribSvcKei.getString(KK0451ETMsg.GENE_ADD_DTM));
			inETMsg.set(KK0451ETMsg.UPD_DTM, updDtm);
			inETMsg.set(KK0451ETMsg.UPD_OPEACNT, updOpeAct);
			
			// 更新を行う
			try
			{
				super.update(inETMsg);
			}
			catch (CAANFinderException cfe)
			{
				throw new CAANRuntimeException(cfe);
			}
		}

		//ANK-2348-00-00 ADD START
		// 電話パック割の割引サービス契約を取得
		HashMap<String, String[]> searchMap = new HashMap<String, String[]>();
		searchMap.put(KK0451ETMsg.WRIB_SVC_KEI_STAT, new String[]{JKKModelConst.WRIB_SVC_KEI_STAT_SVCTK_CHU});
		// ANK-3754-00-00 MOD START
		//searchMap.put(KK0451ETMsg.WRIB_SVC_CD, new String[]{JKKModelConst.WRIB_SVC_CD_PAC3, JKKModelConst.WRIB_SVC_CD_PAC7});
		searchMap.put(KK0451ETMsg.WRIB_SVC_CD, new String[]{JKKModelConst.WRIB_SVC_CD_PAC3, JKKModelConst.WRIB_SVC_CD_PAC7, JKKModelConst.WRIB_SVC_CD_ANSN_TEL_PAC});
		// ANK-3754-00-00 MOD END
		CAANMsg[] retKK0451 = new JKKejbKK0451DBABase().getKK0451byVariKei(JKKModelConst.OYA_KEI_SKBT_CD_SVC_KEI, svcKeiNo, 
				null, null,null, null, null, searchMap, opeDate, "1");
		
		for (CAANMsg wribSvcKei: retKK0451)
		{			
			// 休止課金開始年月日と休止解除年月日を設定
			CAANMsg inETMsg = getWribPauseYmdTelOpPac(wribSvcKei, opeDate);

			if (inETMsg != null)
			{
				inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, wribSvcKei.getString(KK0451ETMsg.WRIB_SVC_KEI_NO));
				inETMsg.set(KK0451ETMsg.GENE_ADD_DTM, wribSvcKei.getString(KK0451ETMsg.GENE_ADD_DTM));
				inETMsg.set(KK0451ETMsg.UPD_DTM, updDtm);
				inETMsg.set(KK0451ETMsg.UPD_OPEACNT, updOpeAct);
				
				// 更新を行う
				try
				{
					super.update(inETMsg);
				}
				catch (CAANFinderException cfe)
				{
					throw new CAANRuntimeException(cfe);
				}
			}
		}
		//ANK-2348-00-00 ADD END

		
		//ANK-2135-02-00 DEL START
//		//ANK-2135-00-00 ADD START
//		// スターチャンネルセット割の割引サービス契約を取得
//		HashMap<String, String[]> searchMap = new HashMap<String, String[]>();
//		searchMap.put(KK0451ETMsg.WRIB_SVC_KEI_STAT, new String[]{JKKModelConst.WRIB_SVC_KEI_STAT_SVCTK_CHU});
//		searchMap.put(KK0451ETMsg.WRIB_SVC_CD, new String[]{JKKModelConst.WRIB_SVC_CD_STAR_CHANNEL});
//		CAANMsg[] retKK0451 = new JKKejbKK0451DBABase().getKK0451byVariKei(JKKModelConst.OYA_KEI_SKBT_CD_SVC_KEI, svcKeiNo, 
//				null, null,null, null, null, searchMap, opeDate, "1");
//		
//		for (CAANMsg wribSvcKei: retKK0451)
//		{			
//			// 休止課金開始年月日と休止解除年月日を設定
//			CAANMsg inETMsg = getWribPauseYmdStarChannel(wribSvcKei, opeDate);
//
//			if (inETMsg != null)
//			{
//				inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, wribSvcKei.getString(KK0451ETMsg.WRIB_SVC_KEI_NO));
//				inETMsg.set(KK0451ETMsg.GENE_ADD_DTM, wribSvcKei.getString(KK0451ETMsg.GENE_ADD_DTM));
//				inETMsg.set(KK0451ETMsg.UPD_DTM, updDtm);
//				inETMsg.set(KK0451ETMsg.UPD_OPEACNT, updOpeAct);
//				
//				// 更新を行う
//				try
//				{
//					super.update(inETMsg);
//				}
//				catch (CAANFinderException cfe)
//				{
//					throw new CAANRuntimeException(cfe);
//				}
//			}
//		}
//		//ANK-2135-00-00 ADD END
		//ANK-2135-02-00 DEL END
	}
	
	/**
	 * <p>
	 * サービス契約番号に紐づくセット割の割引サービス契約明細を取得します。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param stdYmd 基準年月日
	 * @return 割引サービス契約明細
	 */
	private CAANMsg[] getSetWribSvcKei(String svcKeiNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0451ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(getSelectColumnListString(getSelectDBColumnList()));
			sql_Buff.append(" FROM   KK_T_WRIB_SVC_KEI KK0451 ");
			sql_Buff.append(" WHERE  EXISTS ( ");
			sql_Buff.append("     SELECT 1 ");
			sql_Buff.append("     FROM   KK_T_WRISVC_TG_KEI KK0481 ");
			sql_Buff.append("     WHERE  KK0481.WRIB_SVC_KEI_NO = KK0451.WRIB_SVC_KEI_NO ");
			sql_Buff.append("     AND    KK0481.TG_KEI_SKBT_CD = '01' ");
			sql_Buff.append("     AND    KK0481.SVC_KEI_NO = ? ");
			sql_Buff.append("     AND    KK0481.WRISVC_TG_KEI_TSTAYMD <= ? ");
			sql_Buff.append("     AND    KK0481.WRISVC_TG_KEI_TENDYMD >= ? ");
			sql_Buff.append("     AND   (KK0481.WRIB_SVC_KEI_NO, KK0481.WRIB_SVC_TRGT_KEI_NO, KK0481.GENE_ADD_DTM) = ");
			sql_Buff.append("        (SELECT KK0481_GENE.WRIB_SVC_KEI_NO, KK0481_GENE.WRIB_SVC_TRGT_KEI_NO, MAX(KK0481_GENE.GENE_ADD_DTM) AS KK0481_MAX ");
			sql_Buff.append("         FROM   KK_T_WRISVC_TG_KEI KK0481_GENE ");
			sql_Buff.append("         WHERE  KK0481_GENE.WRIB_SVC_KEI_NO = KK0481.WRIB_SVC_KEI_NO ");
			sql_Buff.append("         AND    KK0481_GENE.WRIB_SVC_TRGT_KEI_NO = KK0481.WRIB_SVC_TRGT_KEI_NO ");
			sql_Buff.append("         AND    KK0481_GENE.MK_FLG = '0' ");
			sql_Buff.append("         GROUP BY KK0481_GENE.WRIB_SVC_KEI_NO, KK0481_GENE.WRIB_SVC_TRGT_KEI_NO) ");
			sql_Buff.append(" ) ");
			sql_Buff.append(" AND   (KK0451.WRIB_SVC_KEI_NO, KK0451.RSV_APLY_YMD || KK0451.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0451_GENE.WRIB_SVC_KEI_NO, MAX(KK0451_GENE.RSV_APLY_YMD || KK0451_GENE.GENE_ADD_DTM) AS KK0451_MAX ");
			sql_Buff.append("     FROM   KK_T_WRIB_SVC_KEI KK0451_GENE ");
			sql_Buff.append("     WHERE  KK0451_GENE.WRIB_SVC_KEI_NO = KK0451.WRIB_SVC_KEI_NO ");
			sql_Buff.append("     AND    KK0451_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("     AND    KK0451_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("     AND    KK0451_GENE.MK_FLG = '0'  ");
			sql_Buff.append("     GROUP BY KK0451_GENE.WRIB_SVC_KEI_NO)  ");
			sql_Buff.append(" AND  EXISTS ( ");
			sql_Buff.append("     SELECT 1 ");
			sql_Buff.append("     FROM   KK_M_WRIB_SVC KK0841 ");
			sql_Buff.append("     WHERE  KK0841.WRIB_SVC_CD = KK0451.WRIB_SVC_CD ");
			sql_Buff.append("     AND    KK0841.WRIB_TYPE_CD = '10' ");
			sql_Buff.append("     AND   (KK0841.WRIB_SVC_CD, KK0841.GENE_ADD_DTM) = ");
			sql_Buff.append("        (SELECT KK0841_GENE.WRIB_SVC_CD, MAX(KK0841_GENE.GENE_ADD_DTM) AS KK0841_MAX ");
			sql_Buff.append("         FROM   KK_M_WRIB_SVC KK0841_GENE ");
			sql_Buff.append("         WHERE  KK0841_GENE.WRIB_SVC_CD = KK0841.WRIB_SVC_CD ");
			sql_Buff.append("         AND    KK0841_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("         AND    KK0841_GENE.MK_FLG = '0' ");
			sql_Buff.append("         GROUP BY KK0841_GENE.WRIB_SVC_CD) ");
			sql_Buff.append(" ) ");
			sql_Buff.append(" AND    KK0451.WRIB_SVC_KEI_STAT IN('010','100') ");
			
			arraylist.add(svcKeiNo);
			arraylist.add(stdYmd);
			arraylist.add(stdYmd);
			arraylist.add(stdYmd);
			arraylist.add(stdYmd);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索データの設定
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery, getSelectMsgColumnList(), 0);

			return outMsg1;
		}
		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 wribSvcKei 割引サービス契約
	 * @param stdYmd 基準年月日
	 * @return 休止課金開始年月日と休止解除年月日を設定したCAANMsg
	 */
	private CAANMsg getWribPauseYmd(CAANMsg wribSvcKei, String stdYmd)
	{
		
		CAANMsg outMsg = new CAANMsg(KK0451ETMsg.class.getName());
		
		// 割引サービス契約番号からサービス契約を取得
		CAANMsg[] outMsg1 = new JKKejbKK0081DBABase().getKK0081byWribSvcKei(wribSvcKei.getString(KK0451ETMsg.WRIB_SVC_KEI_NO), new HashMap<String, String[]>(), stdYmd, "1");
		
		// 取得したサービス契約が1件の場合、その値を設定
		if(outMsg1.length == 1)
		{
			outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_YMD, outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD));
			outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD, outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD));
		}
		
		// 1件目の休止課金開始年月日が設定されていない場合、2件目の値を設定
		else if(outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD) == null || outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD).isEmpty())
		{
			outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_YMD, outMsg1[1].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD));
			outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD, outMsg1[1].getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD));
		}
		// 2件目の休止課金開始年月日が設定されていない場合、1件目の値を設定
		else if(outMsg1[1].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD) == null || outMsg1[1].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD).isEmpty())
		{
			outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_YMD, outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD));
			outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD, outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD));
		}
		
		else
		{
			String svcPauseChrsStaYmd1;
			String svcPauseRlsYmd1;
			String svcPauseChrsStaYmd2;
			String svcPauseRlsYmd2;
			
			// 1件目と2件目の休止課金開始年月日を比較し、大きいほうを1とする
			if(outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD).compareTo(outMsg1[1].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD)) > 0)
			{
				svcPauseChrsStaYmd1 = outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD);
				svcPauseRlsYmd1 = outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD);
				svcPauseChrsStaYmd2 = outMsg1[1].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD);
				svcPauseRlsYmd2 = outMsg1[1].getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD);
			}
			else
			{
				svcPauseChrsStaYmd1 = outMsg1[1].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD);
				svcPauseRlsYmd1 = outMsg1[1].getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD);
				svcPauseChrsStaYmd2 = outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD);
				svcPauseRlsYmd2 = outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD);
			}
				
			// 2の休止解除年月日が設定されていない場合、2を設定
			if(svcPauseRlsYmd2 == null || svcPauseRlsYmd2.isEmpty())
			{
				outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_YMD, svcPauseChrsStaYmd2);
				outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD, svcPauseRlsYmd2);
			}
			
			else
			{
				// 1の休止課金開始年月日と2の休止解除年月日+1を比較
				String baseDate = JKKModelCommon.addDay(svcPauseRlsYmd2, 1);
				if(svcPauseChrsStaYmd1.compareTo(baseDate) > 0)
				{
					// 1の休止課金開始年月日が大きければ1を設定
					outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_YMD, svcPauseChrsStaYmd1);
					outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD, svcPauseRlsYmd1);
				}
				
				else
				{
					// 2の休止解除年月日+1が大きければ2の休止課金開始年月日を設定
					outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_YMD, svcPauseChrsStaYmd2);
					
					// 1の休止解除年月日が設定されていない場合、休止解除年月日に空白を設定
					if(svcPauseRlsYmd1 == null || svcPauseRlsYmd1.isEmpty())
					{
						outMsg.setNull(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD);
					}
					
					// 1の休止解除年月日と2の休止解除年月日の大きい値を休止解除年月日に設定
					else if(svcPauseRlsYmd1.compareTo(svcPauseRlsYmd2) > 0)
					{
						outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD, svcPauseRlsYmd1);
					}
					else
					{
						outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD, svcPauseRlsYmd2);
					}
				}
			}
		}
		
		return outMsg;
	}
	
	//ANK-2348-00-00 ADD START
	/**
	 * <p>
	 * 割引サービス契約に紐づくサービス契約から休止課金開始年月日と休止解除年月日を算出します。（電話パック割）
	 * </p>
	 * @param wribSvcKei 割引サービス契約
	 * @param stdYmd 基準年月日
	 * @return 休止課金開始年月日と休止解除年月日を設定したCAANMsg
	 */
	private CAANMsg getWribPauseYmdTelOpPac(CAANMsg wribSvcKei, String stdYmd)
	{
		
		CAANMsg outMsg = new CAANMsg(KK0451ETMsg.class.getName());
		
		// 割引サービス契約番号からサービス契約を取得
		CAANMsg[] outMsg1 = new JKKejbKK0081DBABase().getKK0081byWribSvcKei(wribSvcKei.getString(KK0451ETMsg.WRIB_SVC_KEI_NO), new HashMap<String, String[]>(), stdYmd, "1");
		
		// 取得したサービス契約が1件の場合、その値を設定
		if(outMsg1.length == 1)
		{
			// サービス契約の休止・中断コードが02以外の場合のみ値を設定
			String pauseStpCd = outMsg1[0].getString(KK0081ETMsg.PAUSE_STP_CD);
			if (!JKKModelConst.PAUSE_STP_CD_STP.equals(pauseStpCd))
			{
				outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_YMD, outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD));
				outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD, outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD));
			}
			else
			{
				return null;
			}
		}
		else
		{
			return null;
		}
		
		return outMsg;
	}
	//ANK-2348-00-00 ADD END

	//ANK-2135-02-00 DEL START
//	//ANK-2135-00-00 ADD START
//	/**
//	 * <p>
//	 * 割引サービス契約に紐づくサービス契約から休止課金開始年月日と休止解除年月日を算出します。（スターチャンネルセット割）
//	 * </p>
//	 * @param wribSvcKei 割引サービス契約
//	 * @param stdYmd 基準年月日
//	 * @return 休止課金開始年月日と休止解除年月日を設定したCAANMsg
//	 */
//	private CAANMsg getWribPauseYmdStarChannel(CAANMsg wribSvcKei, String stdYmd)
//	{
//		
//		CAANMsg outMsg = new CAANMsg(KK0451ETMsg.class.getName());
//		
//		// 割引サービス契約番号からサービス契約を取得
//		CAANMsg[] outMsg1 = new JKKejbKK0081DBABase().getKK0081byWribSvcKei(wribSvcKei.getString(KK0451ETMsg.WRIB_SVC_KEI_NO), new HashMap<String, String[]>(), stdYmd, "1");
//		
//		// 取得したサービス契約が1件の場合、その値を設定
//		if(outMsg1.length == 1)
//		{
//			// サービス契約の休止・中断コードが02以外の場合のみ値を設定
//			String pauseStpCd = outMsg1[0].getString(KK0081ETMsg.PAUSE_STP_CD);
//			if (!JKKModelConst.PAUSE_STP_CD_STP.equals(pauseStpCd))
//			{
//				outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_YMD, outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD));
//				outMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD, outMsg1[0].getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD));
//			}
//			else
//			{
//				return null;
//			}
//		}
//		else
//		{
//			return null;
//		}
//		
//		return outMsg;
//	}
//	//ANK-2135-00-00 ADD END
	//ANK-2135-02-00 DEL END
	
	/**
	 * <p>
	 * 長期継続利用割引に紐づく「割引サービス契約」「割引サービス契約内訳」のサービス課金終了年月日を更新する
	 * </p>
	 * @param wribSvcKeiNo 割引サービス契約番号
	 * @param kaihkYmd 回復年月日
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	public void updateSvcChrgEndYmd(String wribSvcKeiNo, String kaihkYmd, String opeDate, String updDtm, String updOpeAct)
	{
		// 直近の料金計算日を取得
		String eventYmd = new JKKejbOtherSysDBABase().getNextEventYmd(kaihkYmd);

		// 「IN.回復年月日」が1〜料金計算日の間でなければ処理対象外
		if (eventYmd == null || kaihkYmd.substring(6, 8).compareTo(eventYmd.substring(6, 8)) > 0 )
		{
			return;
		}

		// 解約時点の割引サービス契約を取得
		CAANMsg kk0451Search = new CAANMsg(KK0451ETMsg.class.getName());
		kk0451Search.set(KK0451ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		kk0451Search.set(KK0451ETMsg.RSV_APLY_YMD, opeDate);
		CAANMsg[] kk0451MsgList = super.findByCurrentSecond(kk0451Search);

		// ２世代目のメインタイプカレントレコードが存在しない場合、終了する
		if (2 > kk0451MsgList.length)
		{
			return;
		}

		CAANMsg kk0451Msg = kk0451MsgList[1];
		
		// 割引サービスコードが長期継続利用割引以外であれば処理対象外
		if (!"W00000041".equals(kk0451Msg.getString(KK0451ETMsg.WRIB_SVC_CD)))
		{
			return;
		}
		// 割引サービス契約.サービス課金終了年月日
		String svcChrgEndYmdWrib = kk0451Msg.getString(KK0451ETMsg.SVC_CHRG_ENDYMD);
		
		// サービス課金終了年月日が設定されていない場合は対象外
		if (svcChrgEndYmdWrib == null)
		{
			return;
		}

		// 割引サービス契約番号に紐づく割引サービス契約対象契約を取得する
		CAANMsg[] kk0481MsgList = new JKKejbKK0481DBABase().getKK0481byWribSvcKei(wribSvcKeiNo, null, opeDate, "0");
		
		// 対象のレコードが存在しない場合、終了する
		if (kk0481MsgList.length < 1)
		{
			return;
		}

		for (CAANMsg kk0481Msg : kk0481MsgList)
		{
			// 解約時点のサービス契約を取得
			CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
			inETMsg.set(KK0081ETMsg.SVC_KEI_NO, kk0481Msg.getString(KK0481ETMsg.SVC_KEI_NO));
			inETMsg.set(KK0081ETMsg.SVC_KEI_STAT, JKKModelConst.SVC_KEI_STAT_DSL_ZM);
			inETMsg.set(KK0081ETMsg.MSKM_DTL_NO, kk0451Msg.getString(KK0451ETMsg.MSKM_DTL_NO));
			inETMsg.set(KK0081ETMsg.RSV_APLY_CD, JKKModelConst.RSV_APLY_CD_RSV_FIX);
			inETMsg.set(KK0081ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

			CAANMsg[] kk0081MsgList = null;
			try
			{
				kk0081MsgList = new KK0081LE().findByCondition(inETMsg);
			}
			catch (CAANException ce)
			{
				throw new CAANRuntimeException(ce);
			}
			
			// 対象のレコードが存在しない場合、終了する
			if (kk0081MsgList.length < 1)
			{
				continue;
			}
			
			for (CAANMsg kk0081Msg : kk0081MsgList)
			{
				String svcChrgEndYmdSvc = kk0081Msg.getString(KK0081ETMsg.SVC_CHRG_ENDYMD);

				// サービス契約と割引サービス契約のサービス課金終了年月日を比較
				// 割引サービス契約のサービス課金終了年月日が後であれば処理対象外
				if (svcChrgEndYmdSvc == null 
						|| JPCDateChecker.isFutureDate(svcChrgEndYmdWrib, svcChrgEndYmdSvc, "1"))
				{
					continue;
				}
				
				try 
				{
					// サービス契約.サービス課金終了年月日と回復年月日が１ヶ月差でなければ処理対象外
					if (svcChrgEndYmdSvc.substring(0, 6).equals(
							JPCDateUtil.addMonth(svcChrgEndYmdWrib, 1).substring(0, 6)))
					{
						// 割引サービス契約を更新
						updateSvcChrgEndYmdWrib(kk0451Msg, svcChrgEndYmdSvc, kk0081Msg.getString(KK0081ETMsg.PLAN_CHRG_ENDYMD), updDtm, updOpeAct);

						// 割引サービス契約内訳を取得
						CAANMsg[] kk2361MsgList = new JKKejbKK2361DBABase().getKK2361byWribSvcKei(wribSvcKeiNo, null, opeDate);
						
						for (CAANMsg kk2361Msg : kk2361MsgList)
						{
							// 割引サービス契約内訳を更新
							updateSvcChrgEndYmdWribUcwk(kk2361Msg, svcChrgEndYmdSvc, updDtm, updOpeAct);
						}
					}
				} 
				catch (java.text.ParseException pe)
				{
					throw new CAANRuntimeException(pe);
				}
			}
			
		}
	}
	
	/**
	 * <p>
	 * 割引サービス契約のサービス課金終了年月日を更新します。
	 * </p>
	 * @param kk0451Msg 更新対象の割引サービス契約
	 * @param svcChrgEndYmd サービス課金終了年月日
	 * @param pleanChrgEndYmd プラン課金終了年月日
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	private void updateSvcChrgEndYmdWrib(CAANMsg kk0451Msg, String svcChrgEndYmd, String pleanChrgEndYmd, String updDtm, String updOpeAct)
	{
		// 解約時点の割引サービス契約を取得
		CAANMsg inETMsg = new CAANMsg(KK0451ETMsg.class.getName());
		
		// 割引サービス契約番号
		inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, kk0451Msg.getString(KK0451ETMsg.WRIB_SVC_KEI_NO));
		
		// 世代登録年月日時分秒
		inETMsg.set(KK0451ETMsg.GENE_ADD_DTM, kk0451Msg.getString(KK0451ETMsg.GENE_ADD_DTM));
		
		// プラン課金終了年月日
		inETMsg.set(KK0451ETMsg.PLAN_CHRG_ENDYMD, pleanChrgEndYmd);

		// サービス課金終了年月日
		inETMsg.set(KK0451ETMsg.SVC_CHRG_ENDYMD, svcChrgEndYmd);
		inETMsg.set(KK0451ETMsg.UPD_DTM, updDtm);
		inETMsg.set(KK0451ETMsg.UPD_OPEACNT, updOpeAct);
		
		// 更新を行う
		try
		{
			super.update(inETMsg);
		}
		catch (CAANFinderException cfe)
		{
			throw new CAANRuntimeException(cfe);
		}
	}
	
	/**
	 * <p>
	 * 割引サービス契約内訳のサービス課金終了年月日を更新します。
	 * </p>
	 * @param kk2361Msg 更新対象の割引サービス契約内訳
	 * @param svcChrgEndYmd サービス課金終了年月日
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	private void updateSvcChrgEndYmdWribUcwk(CAANMsg kk2361Msg, String svcChrgEndYmd, String updDtm, String updOpeAct)
	{
		// 解約時点の割引サービス契約を取得
		CAANMsg inETMsg = new CAANMsg(KK2361ETMsg.class.getName());
		
		// 割引サービス契約番号
		inETMsg.set(KK2361ETMsg.WRIB_SVC_KEI_NO, kk2361Msg.getString(KK2361ETMsg.WRIB_SVC_KEI_NO));
		
		// 割引サービス契約内訳番号
		inETMsg.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO, kk2361Msg.getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO));
		
		// 世代登録年月日時分秒
		inETMsg.set(KK2361ETMsg.GENE_ADD_DTM, kk2361Msg.getString(KK2361ETMsg.GENE_ADD_DTM));
		
		// サービス課金終了年月日
		inETMsg.set(KK2361ETMsg.SVC_CHRG_ENDYMD, svcChrgEndYmd);
		inETMsg.set(KK2361ETMsg.UPD_DTM, updDtm);
		inETMsg.set(KK2361ETMsg.UPD_OPEACNT, updOpeAct);
		
		// 更新を行う
		JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inETMsg);
		dbaUtil.update(inETMsg);
	}
	
//OM-2016-0001938 ADD START
	
	/**
	 * サービス契約に紐づくセット割引の割引対象契約サービス休止年月日、割引対象契約サービス休止解除年月日を更新した世代レコードを登録します。
	 * また、電話パック割の場合も割引対象契約サービス休止年月日、割引対象契約サービス休止解除年月日を更新した世代レコードを登録します。
	 * <br>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @param opeDate 運用日付
	 */
	public void createSetWribPauseYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo, String opeDate)
	{
		// 対象の割引サービス契約を取得
		CAANMsg[] st = getSetWribSvcKei(svcKeiNo, opeDate);
		
		for (CAANMsg wribSvcKei: st)
		{
			// 登録する割引サービス契約の世代データを取得
			CAANMsg inETMsg = getSetWribPauseYmdMsg(inCBSMsg, inContext, opeDate, wribSvcKei);
			if (null == inETMsg)
			{
				continue;
			}
			
			// 登録処理の実行
			try
			{
				super.create(inETMsg);
			}
			catch (CAANCreateException ce)
			{
				throw new CAANRuntimeException(ce);
			}
		}
		
		// 電話パック割の割引サービス契約を取得
		HashMap<String, String[]> searchMap = new HashMap<String, String[]>();
		searchMap.put(KK0451ETMsg.WRIB_SVC_KEI_STAT, new String[]{JKKModelConst.WRIB_SVC_KEI_STAT_SVCTK_CHU});
		// ANK-3754-00-00 MOD START
		//searchMap.put(KK0451ETMsg.WRIB_SVC_CD, new String[]{JKKModelConst.WRIB_SVC_CD_PAC3, JKKModelConst.WRIB_SVC_CD_PAC7});
		searchMap.put(KK0451ETMsg.WRIB_SVC_CD, new String[]{JKKModelConst.WRIB_SVC_CD_PAC3, JKKModelConst.WRIB_SVC_CD_PAC7, JKKModelConst.WRIB_SVC_CD_ANSN_TEL_PAC});
		// ANK-3754-00-00 MOD END
		CAANMsg[] retKK0451 = new JKKejbKK0451DBABase().getKK0451byVariKei(JKKModelConst.OYA_KEI_SKBT_CD_SVC_KEI, svcKeiNo, 
				null, null, null, null, null, searchMap, opeDate, "1");
		
		for (CAANMsg wribSvcKei: retKK0451)
		{
			// 登録する割引サービス契約の世代データを取得
			CAANMsg inETMsg = getSetWribPauseYmdMsg(inCBSMsg, inContext, opeDate, wribSvcKei);
			if (null == inETMsg)
			{
				continue;
			}
			
			// 登録処理の実行
			try
			{
				super.create(inETMsg);
			}
			catch (CAANCreateException ce)
			{
				throw new CAANRuntimeException(ce);
			}
		}
	}
	
	/**
	 * サービス契約に紐づく割引の割引対象契約サービス休止年月日、割引対象契約サービス休止解除年月日を更新した割引サービス契約メッセージを取得します。
	 * <br>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opeDate 運用日付
	 * @param wribSvcKei 処理対象の割引サービス契約メッセージ
	 * @return 登録する世代データの割引サービス契約メッセージ
	 */
	private CAANMsg getSetWribPauseYmdMsg(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opeDate, CAANMsg wribSvcKei)
	{
		// 割引サービス契約のカレント検索
		CAANMsg curInMsg = new CAANMsg(KK0451ETMsg.class.getName());
		curInMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, wribSvcKei.getString(KK0451ETMsg.WRIB_SVC_KEI_NO));
		curInMsg.set(KK0451ETMsg.RSV_APLY_YMD, opeDate);
		CAANMsg curRetMsg = new JKKejbKK0451DBABase().findByCurrent(curInMsg);
		if (null == curRetMsg)
		{
			return null;
		}
		
		// 休止課金開始年月日と休止解除年月日を設定
		CAANMsg pauseYmdMsg = getWribPauseYmd(wribSvcKei, opeDate);
		if (null != pauseYmdMsg)
		{
			curRetMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_YMD, pauseYmdMsg.getString(KK0451ETMsg.WRTGKEI_SVC_PAUSE_YMD));
			curRetMsg.set(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD, pauseYmdMsg.getString(KK0451ETMsg.WRTGKEI_SVC_PAUSE_RLS_YMD));
		}
		// 世代登録年月日時分秒等を設定
		curRetMsg.set(KK0451ETMsg.GENE_ADD_DTM, (String)JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		curRetMsg.set(KK0451ETMsg.RSV_APLY_YMD, opeDate);
		curRetMsg.set(KK0451ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		curRetMsg.set(KK0451ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		curRetMsg.set(KK0451ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		curRetMsg.set(KK0451ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		return curRetMsg;
	}
//OM-2016-0001938 ADD END
// v28.00.00 ADD START
	/**
	 * <p>
	 * 料金スケジュール定義から、運用日付で直近の料金計算の請求年月を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opeDate 運用日付
	 * @return 該当するレコードの請求年月
	 */
	public String getSeikyYm(CAANMsg inMsg, AgentDispatchContext inContext, String opeDate)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(CH0501ETMsg.getTableName());

			// SQL文
			StringBuffer sbSql = new StringBuffer();

			sbSql.append(" SELECT ");
			sbSql.append("     MIN(CH0501.SEIKY_YM) AS SEIKY_YM ");
			sbSql.append(" FROM ");
			sbSql.append("     CH_M_PRC_SCHDL_TEIGI CH0501 ");
			sbSql.append(" WHERE ");
			sbSql.append("     CH0501.EVENT_CD = '03' ");
			sbSql.append("     AND CH0501.EVENT_YMD >= ? ");
			sbSql.append("     AND CH0501.MK_FLG = '0' ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sbSql);

			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 1, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// レコードが取得できなかった場合nullを返却
			if (!rsltQuery.next())
			{
				return null;
			}

			// 取得した請求年月を返却
			return rsltQuery.getString(CH0501ETMsg.SEIKY_YM);
		}
		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 svcKeiNo サービス契約番号
	 * @param stdYmd 基準年月日
	 * @return 割引サービス契約明細
	 */
	public CAANMsg[] getKaiSetWribSvcKei1(String svcKeiNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0451ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(getSelectColumnListString(getSelectDBColumnList()));
			sql_Buff.append(" FROM   KK_T_WRIB_SVC_KEI KK0451 ");
			sql_Buff.append(" WHERE  (KK0451.WRIB_SVC_KEI_NO, KK0451.RSV_APLY_YMD || KK0451.GENE_ADD_DTM) = ");
			sql_Buff.append("        (SELECT KK0451_GENE.WRIB_SVC_KEI_NO, MAX(KK0451_GENE.RSV_APLY_YMD || KK0451_GENE.GENE_ADD_DTM) AS KK0451_MAX ");
			sql_Buff.append("         FROM   KK_T_WRIB_SVC_KEI KK0451_GENE ");
			sql_Buff.append("         WHERE  KK0451_GENE.WRIB_SVC_KEI_NO = KK0451.WRIB_SVC_KEI_NO ");
			sql_Buff.append("         AND    KK0451_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("         AND    KK0451_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("         AND    KK0451_GENE.MK_FLG = '0'  ");
			sql_Buff.append("         GROUP BY KK0451_GENE.WRIB_SVC_KEI_NO )  ");
			sql_Buff.append(" AND    KK0451.WRIB_SVC_KEI_STAT = '910' ");
// v28.00.01 MOD START
//			sql_Buff.append(" AND    KK0451.IDO_DIV NOT IN('00013','00014','00016','00017') ");
			sql_Buff.append(" AND    KK0451.IDO_DIV IN('00005','00006') ");
// v28.00.01 MOD END
			sql_Buff.append(" AND    KK0451.SVC_CHRG_STAYMD <= KK0451.SVC_CHRG_ENDYMD");
			sql_Buff.append(" AND    KK0451.WRIB_SVC_KEI_NO IN( ");
			sql_Buff.append("        SELECT KK0481.WRIB_SVC_KEI_NO ");
			sql_Buff.append("        FROM   KK_T_WRISVC_TG_KEI KK0481 ");
			sql_Buff.append("        WHERE  (KK0481.WRIB_SVC_KEI_NO, KK0481.WRIB_SVC_TRGT_KEI_NO, KK0481.GENE_ADD_DTM) = ");
			sql_Buff.append("               (SELECT KK0481_GENE.WRIB_SVC_KEI_NO, KK0481_GENE.WRIB_SVC_TRGT_KEI_NO, MAX(KK0481_GENE.GENE_ADD_DTM) AS KK0481_MAX ");
			sql_Buff.append("                FROM   KK_T_WRISVC_TG_KEI KK0481_GENE ");
			sql_Buff.append("                WHERE  KK0481_GENE.WRIB_SVC_KEI_NO = KK0481.WRIB_SVC_KEI_NO ");
			sql_Buff.append("                AND    KK0481_GENE.WRIB_SVC_TRGT_KEI_NO = KK0481.WRIB_SVC_TRGT_KEI_NO ");
			sql_Buff.append("                AND    KK0481_GENE.MK_FLG = '0' ");
			sql_Buff.append("                GROUP BY KK0481_GENE.WRIB_SVC_KEI_NO, KK0481_GENE.WRIB_SVC_TRGT_KEI_NO ) ");
			sql_Buff.append("        AND    KK0481.TG_KEI_SKBT_CD = '01' ");
			sql_Buff.append("        AND    KK0481.SVC_KEI_NO = ?) ");
			sql_Buff.append(" AND    KK0451.WRIB_SVC_CD IN( ");
			sql_Buff.append("        SELECT KK0841.WRIB_SVC_CD ");
			sql_Buff.append("        FROM   KK_M_WRIB_SVC KK0841 ");
			sql_Buff.append("        WHERE  KK0841.WRIB_TYPE_CD = '10'  ");
			sql_Buff.append("        AND    KK0841.WRIB_APLY_OPTNTY_CD ='2'  ");
			sql_Buff.append("        AND    KK0841.WRIB_SVC_CD != 'W00000005' ");
			sql_Buff.append("        AND   (KK0841.WRIB_SVC_CD, KK0841.RSV_APLY_YMD || KK0841.GENE_ADD_DTM) =  ");
			sql_Buff.append("              (SELECT KK0841_GENE.WRIB_SVC_CD, MAX(KK0841_GENE.RSV_APLY_YMD || KK0841_GENE.GENE_ADD_DTM) AS KK0841_MAX  ");
			sql_Buff.append("               FROM   KK_M_WRIB_SVC KK0841_GENE  ");
			sql_Buff.append("               WHERE  KK0841_GENE.WRIB_SVC_CD = KK0841.WRIB_SVC_CD  ");
			sql_Buff.append("               AND    KK0841_GENE.RSV_APLY_YMD <= ?  ");
			sql_Buff.append("               AND    KK0841_GENE.MK_FLG = '0' ");
			sql_Buff.append("               GROUP BY KK0841_GENE.WRIB_SVC_CD)) ");
			
			arraylist.add(stdYmd);
			arraylist.add(svcKeiNo);
			arraylist.add(stdYmd);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索データの設定
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery, getSelectMsgColumnList(), 0);

			return outMsg1;
		}
		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 wribSvcKeiNo 割引サービス契約番号
	 * @param stdYmd 基準年月日
	 * @return 割引サービス契約明細
	 */
	public CAANMsg[] getKaiSetWribSvcKei2(String wribSvcKeiNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0451ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(getSelectColumnListString(getSelectDBColumnList()));
 			sql_Buff.append(" FROM   KK_T_WRIB_SVC_KEI KK0451 ");
 			sql_Buff.append(" WHERE  KK0451.WRIB_SVC_KEI_NO = ? ");
			sql_Buff.append(" AND    KK0451.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" AND    KK0451.RSV_APLY_CD = '2' ");
			sql_Buff.append(" AND    KK0451.MK_FLG = '0'  ");
 			sql_Buff.append(" ORDER BY KK0451.RSV_APLY_YMD DESC, KK0451.GENE_ADD_DTM DESC ");
			
			arraylist.add(wribSvcKeiNo);
			arraylist.add(stdYmd);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索データの設定
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery, getSelectMsgColumnList(), 0);

			return outMsg1;
		}
		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);
			}
		}
	}
// v28.00.00 ADD END
}
