/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JEKK0081C260ETDA
 *	ソースファイル名：JEKK0081C260ETDA.java
 *	作成者			：EK103142
 *	日付			：2011年10月09日
 *＜機能概要＞
 *	サービス契約解約中止 ETMsgDBアクセス部品
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00
 *  v4.00.00    2012/01/15  FJ)寺園     ANK-1292-00-00
 *  v4.00.01    2013/01/17  FJ)坂本     ST1-2012-0000846
 *  v4.00.02    2013/03/29  FJ)竹内     ST4-2013-0000382)遡及解約対応・課金終了日更新処理修正
 *  v4.00.03    2013/05/02  FJ)寺本     IT1-2013-0001110
 *  v5.00.00    2013/07/03  FJ）寺本    KT1-2013-0000691
 *	v8.00.00	2014/01/17	FJ)寺園		ANK-1586-00-00
 *  v16.00.00   2015/05/28  FJ)中原     ANK-2480-00-00 新電力対応
 *  v37.00.00   2018/04/06  FJ)澤田     ANK-3366-00-00 eo光設備卸対応
********************************************************************************/

package eo.ejb.common.db;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0081LE;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK0081C260CBSMsg;
import eo.ejb.cbs.mainproc.JKKejbIdoRsvUtil;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.rule.JKKejbRule0083001;

/**
 * <p>
 * サービス契約解約中止解約ETMsgDBアクセス部品です。
 * </p>
 * @author 富士通
 */
public class JEKK0081C260ETDA
{
	/** 予約適用コード：予約確定 */
	private static final String YOYAKU_KAKUTEI = "2";

	/** 異動予約詳細コード：サービス解約 */
	private static final String IDO_RSV_CD_SVC_KAIYAKU = "007";
	
	/** 異動予約状態コード：予約手続中 */
	private static final String IDO_RSV_STAT_CD_RSV_TETUDUKI = "03"; 

	/** 異動予約状態コード：反映済 */
	private static final String YOYAKU_HANEIZUMI = "01";

	/** 異動予約状態コード：未反映 */
	private static final String YOYAKU_MIHANEI = "00";

	/** ルールエンジン返却値：振舞対象スキーマ項目名 */
	private static final String TRGT_SCHEMA_ID = "TRGT_SCHEMA_ID";

	/** ルールエンジン返却値：振舞対象スキーマ（異動予約） */
	private static final String SCHEMA_KK1681 = "KK1681";

	/** ルールエンジン返却値：異動予約状態コード（異動予約） */
	private static final String IDO_RSV_STAT_CD = "IDO_RSV_STAT_CD";

	/** サービス契約ステータスコード：解約済（異動予約） */
	private static final String SVC_KEI_STAT_KAUYAKUZUMI = "910";

	/** プラン終了種別コード：プラン変更に伴う終了 */
	private static final String PLAN_END_SBT_CD_PLAN_CHANGE = "1";
	
	/** 無効フラグ：有効 */
	private static final String MKFLG_VALID = "0";
	
	/** 年月日：初期値 */
	private static final String YMD_SHKV = "20991231";

	/**
	 * コンストラクタ
	 */
	public JEKK0081C260ETDA()
	{
	}

	/**
	 * 相関ルール振舞判定を行い、DBアクセス部品を呼び出す
	 * 
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JEKK0081C260ETDA.execDBAccess");

		// ルールエンジン用入力値設定
		JKKejbRule0083001 rule0083 = new JKKejbRule0083001(inCBSMsg);
		rule0083.setSvc_if_id(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY)); // サービスIFIDを設定	
		rule0083.setBase_date(inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD)); // 基準日を設定(サービス終了年月日)	
		rule0083.setOpe_date(JKKModelCommon.getOpeDate(inCBSMsg)); // 運用日時を設定

		// ルールエンジン実行
		ArrayList<HashMap<String, Object>> rslt = rule0083.referRuleEngine();

		//結果が取得できなかった場合は更新処理しない
		if (rslt == null || rslt.size() == 0)
		{
			// 相関エラーのステータスを設定
			inCBSMsg.set(EKK0081C260CBSMsg.SVC_KEI_NO_ERR, "EA");
			inCBSMsg.set(EKK0081C260CBSMsg.STATUS, StatusCodes.TEMPLATE_CORRELATION_ERR);
			return;
		}

		// 相関ルールチェック結果を格納
		new JKKejbIdoRsvUtil().setOnlyIdoRsvFlg(inCBSMsg, inContext, rslt);
		
		String ido_rsv_stat_cd = null;
		
		// メッセージ変換を行いDBアクセスを行う
		for (int i = 0; i < rslt.size(); i++)
		{
			HashMap<String, Object> rs = rslt.get(i);

			// 振舞対象スキーマが異動予約の場合、即時か予約かを判定
			if (SCHEMA_KK1681.equals(rs.get(TRGT_SCHEMA_ID)))
			{
				if (YOYAKU_HANEIZUMI.equals(rs.get(IDO_RSV_STAT_CD)))
				{
					//異動予約状態コードが「反映済」であれば、即時
					ido_rsv_stat_cd = YOYAKU_HANEIZUMI;

				}
				else
				{
					//異動予約状態コードが「未反映」であれば、予約
					ido_rsv_stat_cd = YOYAKU_MIHANEI;

				}
				
				// DBアクセス(即時：異動予約＆サービス契約、予約：異動予約のみ)
				updateKK1681(inCBSMsg, inContext, ido_rsv_stat_cd);
				
				break;
			}

		}

		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JEKK0081C260ETDA.execDBAccess");
	}

	/**
	 * 異動予約への更新を行います。
	 * 即時の場合は、サービス契約の作成も行います。
	 * @param inCBSMsg 入力メッセージ
	 * @param inContext AgentDispatchContext
	 * @param kbn 予約/即時の区分
	 */
	private void updateKK1681(CAANMsg inCBSMsg, AgentDispatchContext inContext, String kbn)
	{
		// 異動予約更新用Msg生成
		CAANMsg update1681ETMsg = new CAANMsg(KK1681ETMsg.class.getName());

		// 申込明細番号
		String mskm_dtl_no = null;

		// 違約金発生コード
		String pnlty_hassei_cd = null;

		// 異動区分
		String ido_div = null;

		try
		{
			// 異動予約メッセージインスタンスを生成
			CAANMsg idoMsg = new CAANMsg(KK1681ETMsg.class.getName());

			// サービス契約番号に紐付く異動予約番号を取得するためにメッセージを生成
			idoMsg.set(KK1681ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO));
			idoMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDO_RSV_CD_SVC_KAIYAKU);
			idoMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDO_RSV_STAT_CD_RSV_TETUDUKI);
			idoMsg.set(KK1681ETMsg.MK_FLG, "0");

			// KK1681LEインスタンスの生成
			KK1681LE idoLe = new KK1681LE();

			// ロジカルエンティティを生成し、異動予約を検索
			 CAANMsg[] resIdoMsg = idoLe.findByCondition(idoMsg);
			
			/* ----------------------------------------------------------------------------------------------------
			 * 複数の「異動予約」(異動予約詳細コード＝"解約")が存在する場合、
			 * 異動区分、申込明細番号などを入力項目(必須)として、更新対象の「異動予約」を特定する必要があるが、
			 * 現時点では、入力値が存在しないため、異動予約番号が最大の「異動予約」を更新対象とする。
			 * ---------------------------------------------------------------------------------------------------- */
			// 更新対象「異動予約」
			CAANMsg updTgKK1681Msg = null;
			// 更新対象「異動予約」の異動予約番号
			String updTgIdoRsvNo = null;

			for (CAANMsg kk1681Msg : resIdoMsg)
			{
				// 入力.異動区分が指定されている場合、異動区分が異なる「異動予約」は更新対象外とする。
				if (inCBSMsg.getString(EKK0081C260CBSMsg.IDO_DIV) != null
						&& !inCBSMsg.getString(EKK0081C260CBSMsg.IDO_DIV).equals(kk1681Msg.getString(KK1681ETMsg.IDO_DIV)))
				{
					continue;
				}
				String idoRsvNo = kk1681Msg.getString(KK1681ETMsg.IDO_RSV_NO);
				if (updTgIdoRsvNo == null || updTgIdoRsvNo.compareTo(idoRsvNo) < 0)
				{
					updTgIdoRsvNo = idoRsvNo;
					updTgKK1681Msg = kk1681Msg;
				}
			}
			if (updTgKK1681Msg == null)
			{
				throw new CAANRuntimeException("解約確定対象のサービス契約に対する異動予約が存在しません。サービス契約番号:" + inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO));
			}

			String opedate = JKKModelCommon.getOpeDate(inCBSMsg);
			String rsvAplyYmd = null;
			// 運用日 ＞ サービス終了年月日の場合
			if (JPCUtilCommon.isPastDate(inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD), opedate, "1"))
			{
				rsvAplyYmd = opedate;
			}
			else
			{
				rsvAplyYmd = inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD);
			}

			// 解約対象の異動予約を更新する
			// 異動予約番号	IDO_RSV_NO
			update1681ETMsg.set(KK1681ETMsg.IDO_RSV_NO, updTgKK1681Msg.getString(KK1681ETMsg.IDO_RSV_NO));

			// 予約適用年月日
			update1681ETMsg.set(KK1681ETMsg.RSV_APLY_YMD, rsvAplyYmd);
			if (YOYAKU_HANEIZUMI.equals(kbn))
			{
				// 異動予約状態コードが"反映済"の場合、異動予約反映年月日を設定
				update1681ETMsg.set(KK1681ETMsg.IDO_RSV_HANEI_YMD, rsvAplyYmd);
			}

			// 異動予約状態コード
			update1681ETMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, kbn);

			// 更新年月日時分秒
			update1681ETMsg.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));

			// 更新オペレータアカウント
			update1681ETMsg.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

			// 更新処理の実行
			JKKejbDBAUtil dbaUtil1681 = new JKKejbDBAUtil(inCBSMsg);
			dbaUtil1681.update(update1681ETMsg);

			// サービス契約作成用の情報
			// 申込明細番号
			mskm_dtl_no = updTgKK1681Msg.getString(KK1681ETMsg.MSKM_DTL_NO);

			// 違約金発生コード
			pnlty_hassei_cd = updTgKK1681Msg.getString(KK1681ETMsg.PNLTY_HASSEI_CD);

			// 異動区分
			ido_div = updTgKK1681Msg.getString(KK1681ETMsg.IDO_DIV);

		}
		catch(CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// 返却項目メッセージ生成
		inCBSMsg.set(EKK0081C260CBSMsg.UPD_DTM, update1681ETMsg.getString(KK1681ETMsg.UPD_DTM));
		inCBSMsg.set(EKK0081C260CBSMsg.UPD_OPEACNT, update1681ETMsg.getString(KK1681ETMsg.UPD_OPEACNT));
		inCBSMsg.set(EKK0081C260CBSMsg.IDO_DIV, ido_div);
		inCBSMsg.set(EKK0081C260CBSMsg.MSKM_DTL_NO, mskm_dtl_no);

		// 即時の場合は、サービス契約の作成処理を呼び出す
		if (YOYAKU_HANEIZUMI.equals(kbn))
		{
			createKK0081(inCBSMsg, inContext, mskm_dtl_no, pnlty_hassei_cd, ido_div);
		}

	}

	/**
	 * サービス契約の作成を行います。
	 * @param inCBSMsg 入力メッセージ
	 * @param inContext AgentDispatchContext
	 * @param mskm_dtl_no 申込明細番号
	 * @param pnlty_hassei_cd 違約金発生コード
	 * @param ido_div 異動区分
	 */
	private void createKK0081(CAANMsg inCBSMsg, AgentDispatchContext inContext, String mskm_dtl_no, String pnlty_hassei_cd, String ido_div)
	{

		// サービス契約のカレントレコード取得
		CAANMsg inETMsgCurrent = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsgCurrent.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_KEI_NO));
		inETMsgCurrent.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		CAANMsg retCurrent = new JKKejbKK0081DBABase().findByCurrent(inETMsgCurrent);

		// ANK-3366-00-00 ADD START
		String svcCd = retCurrent.getString(KK0081ETMsg.SVC_CD);
		String svcChrgYmd = "";
		// 卸事業者の契約場合、課金非課金を判定して、サービス課金開始日・プラン課金開始日を変更する。
		if ("01".equals(svcCd))
		{
			svcChrgYmd = (String)JKKModelCommon.getChrgStaYmdEKK0081C260(inCBSMsg, retCurrent, inContext);
		}
		// ANK-3366-00-00 ADD END
		
		// サービス契約解約確定新規レコード用Msg生成
		CAANMsg inETMsgSvcKei = new CAANMsg(KK0081ETMsg.class.getName());

		// サービス契約番号
		inETMsgSvcKei.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_KEI_NO));

		// 世代登録年月日時分秒
		inETMsgSvcKei.set(KK0081ETMsg.GENE_ADD_DTM, (String)JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));

		// サービス契約ステータス	SVC_KEI_STAT
		inETMsgSvcKei.set(KK0081ETMsg.SVC_KEI_STAT, SVC_KEI_STAT_KAUYAKUZUMI);

		// SYSID	SYSID
		inETMsgSvcKei.set(KK0081ETMsg.SYSID, retCurrent.getString(KK0081ETMsg.SYSID));

		// サービスコード	SVC_CD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_CD, retCurrent.getString(KK0081ETMsg.SVC_CD));

		// 申込明細番号	MSKM_DTL_NO
		inETMsgSvcKei.set(KK0081ETMsg.MSKM_DTL_NO, mskm_dtl_no);

		// 整理番号 SEIRI_NO
		inETMsgSvcKei.set(KK0081ETMsg.SEIRI_NO, retCurrent.getString(KK0081ETMsg.SEIRI_NO));

		// 面開発案件番号	MENKAIHAT_ANKEN_NO
		inETMsgSvcKei.set(KK0081ETMsg.MENKAIHAT_ANKEN_NO, retCurrent.getString(KK0081ETMsg.MENKAIHAT_ANKEN_NO));

		// 料金グループコード	PRC_GRP_CD
		inETMsgSvcKei.set(KK0081ETMsg.PRC_GRP_CD, retCurrent.getString(KK0081ETMsg.PRC_GRP_CD));

		// 料金コースコード	PCRS_CD
		inETMsgSvcKei.set(KK0081ETMsg.PCRS_CD, retCurrent.getString(KK0081ETMsg.PCRS_CD));

		// 料金プランコード	PPLAN_CD
		inETMsgSvcKei.set(KK0081ETMsg.PPLAN_CD, retCurrent.getString(KK0081ETMsg.PPLAN_CD));

		// 提供方式契約番号	TK_HOSHIKI_KEI_NO
		inETMsgSvcKei.set(KK0081ETMsg.TK_HOSHIKI_KEI_NO, retCurrent.getString(KK0081ETMsg.TK_HOSHIKI_KEI_NO));

		// サービス利用開始希望年月日	SVC_USE_STA_KIBO_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_USE_STA_KIBO_YMD, retCurrent.getString(KK0081ETMsg.SVC_USE_STA_KIBO_YMD));

		// 予約適用開始希望年月日	RSV_TSTA_KIBO_YMD
		inETMsgSvcKei.set(KK0081ETMsg.RSV_TSTA_KIBO_YMD, retCurrent.getString(KK0081ETMsg.RSV_TSTA_KIBO_YMD));

		// ID速報書出力要否	ID_SOKHOSHO_OUTPUT_YH
		inETMsgSvcKei.set(KK0081ETMsg.ID_SOKHOSHO_OUTPUT_YH, retCurrent.getString(KK0081ETMsg.ID_SOKHOSHO_OUTPUT_YH));

		// サービス契約後続業務依頼年月日	SVC_KEI_KZKWRK_REQYMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_KEI_KZKWRK_REQYMD, retCurrent.getString(KK0081ETMsg.SVC_KEI_KZKWRK_REQYMD));

		// 照査年月日	SHOSA_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SHOSA_YMD, retCurrent.getString(KK0081ETMsg.SHOSA_YMD));

		// 照査取消年月日	SHOSA_CL_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SHOSA_CL_YMD, retCurrent.getString(KK0081ETMsg.SHOSA_CL_YMD));

		// 審査結果コード	SKEKKA_CD
		inETMsgSvcKei.set(KK0081ETMsg.SKEKKA_CD, retCurrent.getString(KK0081ETMsg.SKEKKA_CD));

		// 審査結果詳細コード	SKEKKA_DTL_CD
		inETMsgSvcKei.set(KK0081ETMsg.SKEKKA_DTL_CD, retCurrent.getString(KK0081ETMsg.SKEKKA_DTL_CD));

		// 審査結果補記コード	SKEKKA_HOKI_CD
		inETMsgSvcKei.set(KK0081ETMsg.SKEKKA_HOKI_CD, retCurrent.getString(KK0081ETMsg.SKEKKA_HOKI_CD));

		// 審査結果送信コード	SKEKKA_SEND_CD
		inETMsgSvcKei.set(KK0081ETMsg.SKEKKA_SEND_CD, retCurrent.getString(KK0081ETMsg.SKEKKA_SEND_CD));

		// 支払い方法継続フラグ	PAYWAY_KEIZOKU_FLG
		inETMsgSvcKei.set(KK0081ETMsg.PAYWAY_KEIZOKU_FLG, retCurrent.getString(KK0081ETMsg.PAYWAY_KEIZOKU_FLG));

		// 試用加入年月日	FTRIAL_KANYU_YMD
		inETMsgSvcKei.set(KK0081ETMsg.FTRIAL_KANYU_YMD, retCurrent.getString(KK0081ETMsg.FTRIAL_KANYU_YMD));

		// 試用期間終了年月日	FTRIAL_PRD_ENDYMD
		inETMsgSvcKei.set(KK0081ETMsg.FTRIAL_PRD_ENDYMD, retCurrent.getString(KK0081ETMsg.FTRIAL_PRD_ENDYMD));

		// 本加入年月日	HONKANYU_YMD
		inETMsgSvcKei.set(KK0081ETMsg.HONKANYU_YMD, retCurrent.getString(KK0081ETMsg.HONKANYU_YMD));

		// 本加入移行期限年月日	HONKANYU_IKO_KIGEN_YMD
		inETMsgSvcKei.set(KK0081ETMsg.HONKANYU_IKO_KIGEN_YMD, retCurrent.getString(KK0081ETMsg.HONKANYU_IKO_KIGEN_YMD));

		// 契約締結年月日	KEI_CNC_YMD
		inETMsgSvcKei.set(KK0081ETMsg.KEI_CNC_YMD, retCurrent.getString(KK0081ETMsg.KEI_CNC_YMD));

		// プラン開始年月日	PLAN_STAYMD
		inETMsgSvcKei.set(KK0081ETMsg.PLAN_STAYMD, retCurrent.getString(KK0081ETMsg.PLAN_STAYMD));

		// プラン終了年月日	PLAN_ENDYMD
		inETMsgSvcKei.set(KK0081ETMsg.PLAN_ENDYMD, JKKModelCommon.getYmdDslFix(inCBSMsg, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD)));

		// ANK-3366-00-00 MOD START
//		// プラン課金開始年月日	PLAN_CHRG_STAYMD
//		inETMsgSvcKei.set(KK0081ETMsg.PLAN_CHRG_STAYMD, retCurrent.getString(KK0081ETMsg.PLAN_CHRG_STAYMD));
		if (svcChrgYmd == null || "".equals(svcChrgYmd))
		{
			inETMsgSvcKei.set(KK0081ETMsg.PLAN_CHRG_STAYMD, retCurrent.getString(KK0081ETMsg.PLAN_CHRG_STAYMD));
		}
		//卸事業かつサービス開始後かつ課金開始前の場合は、プラン課金開始年月日にサービス開始日を登録する。
		else
		{
			inETMsgSvcKei.set(KK0081ETMsg.PLAN_CHRG_STAYMD, svcChrgYmd);
		}
		// ANK-3366-00-00 MOD END
		//2015-5-28　中原　ANK-2480-00-00 新電力対応 MOD START
		// プラン課金終了年月日	PLAN_CHRG_ENDYMD
//		// 「サービス契約」が"ＭＶＮＯサービス" の場合
//		if(JKKModelCommon.isEqualsSvcKK2821(inCBSMsg, inContext, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_KEI_NO), "51"))
		// 「サービス契約」が"ＭＶＮＯサービス" または "電気サービス"の場合
		if(JKKModelCommon.isEqualsSvcKK2821(inCBSMsg, inContext, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_KEI_NO), "51,05"))
		//2015-5-28　中原　ANK-2480-00-00 新電力対応 MOD END
		{
			inETMsgSvcKei.set(KK0081ETMsg.PLAN_CHRG_ENDYMD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_CHRG_ENDYMD));
		}
		else
		{
			inETMsgSvcKei.set(KK0081ETMsg.PLAN_CHRG_ENDYMD, 
					JKKModelCommon.addDay(inCBSMsg, inContext, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD), "-1"));
		}
		
		// 予約適用年月日	RSV_APLY_YMD
		String opedate = JKKModelCommon.getOpeDate(inCBSMsg);
		// 運用日 ＞ サービス終了年月日の場合
		if (JPCUtilCommon.isPastDate(inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD), opedate, "1"))
		{
			inETMsgSvcKei.set(KK0081ETMsg.RSV_APLY_YMD, opedate);
		}
		else
		{
			inETMsgSvcKei.set(KK0081ETMsg.RSV_APLY_YMD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD));
		}

		// 予約適用コード	RSV_APLY_CD
		inETMsgSvcKei.set(KK0081ETMsg.RSV_APLY_CD, YOYAKU_KAKUTEI);

		// サービスキャンセル年月日	SVC_CANCEL_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_CANCEL_YMD, retCurrent.getString(KK0081ETMsg.SVC_CANCEL_YMD));

		// サービスキャンセル理由コード	SVC_CANCEL_RSN_CD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_CANCEL_RSN_CD, retCurrent.getString(KK0081ETMsg.SVC_CANCEL_RSN_CD));

		// サービス開始年月日	SVC_STA_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_STA_YMD, retCurrent.getString(KK0081ETMsg.SVC_STA_YMD));
		// ANK-3366-00-00 MOD START
//		// サービス課金開始年月日	SVC_CHRG_STAYMD
//		inETMsgSvcKei.set(KK0081ETMsg.SVC_CHRG_STAYMD, retCurrent.getString(KK0081ETMsg.SVC_CHRG_STAYMD));
		if (svcChrgYmd == null || "".equals(svcChrgYmd))
		{
			// サービス課金開始年月日	SVC_CHRG_STAYMD
			inETMsgSvcKei.set(KK0081ETMsg.SVC_CHRG_STAYMD, retCurrent.getString(KK0081ETMsg.SVC_CHRG_STAYMD));
		}
		//卸事業かつサービス開始後かつ課金開始前の場合は、サービス課金開始年月日にサービス開始日を登録する。
		else
		{
			// サービス課金開始年月日	SVC_CHRG_STAYMD
			inETMsgSvcKei.set(KK0081ETMsg.SVC_CHRG_STAYMD, svcChrgYmd);
			
		}
		// ANK-3366-00-00 MOD END
		// 継続サービス開始年月日	KEIZK_SVC_STAYMD
		inETMsgSvcKei.set(KK0081ETMsg.KEIZK_SVC_STAYMD, retCurrent.getString(KK0081ETMsg.KEIZK_SVC_STAYMD));

		// 継続サービス課金開始年月日	KEIZK_SVC_CHRG_STAYMD
		inETMsgSvcKei.set(KK0081ETMsg.KEIZK_SVC_CHRG_STAYMD, retCurrent.getString(KK0081ETMsg.KEIZK_SVC_CHRG_STAYMD));	
		
		// レター発送仕分区分	LETTER_HASSO_SHIWAKE_DIV
		inETMsgSvcKei.set(KK0081ETMsg.LETTER_HASSO_SHIWAKE_DIV, retCurrent.getString(KK0081ETMsg.LETTER_HASSO_SHIWAKE_DIV));

		// サンキューレター送付先コード	THNX_LETTER_SHS_CD
		inETMsgSvcKei.set(KK0081ETMsg.THNX_LETTER_SHS_CD, retCurrent.getString(KK0081ETMsg.THNX_LETTER_SHS_CD));

		// EBオプション追加不可フラグ	WEB_OP_ADD_FAIL_FLG
		inETMsgSvcKei.set(KK0081ETMsg.WEB_OP_ADD_FAIL_FLG, retCurrent.getString(KK0081ETMsg.WEB_OP_ADD_FAIL_FLG));

		// サービス停止年月日	SVC_STP_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_STP_YMD, retCurrent.getString(KK0081ETMsg.SVC_STP_YMD));

		// サービス停止理由コード	SVC_STP_RSN_CD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_STP_RSN_CD, retCurrent.getString(KK0081ETMsg.SVC_STP_RSN_CD));

		// サービス停止解除年月日	SVC_STP_RLS_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_STP_RLS_YMD, retCurrent.getString(KK0081ETMsg.SVC_STP_RLS_YMD));

		// サービス停止解除理由コード	SVC_STP_RLS_RSN_CD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_STP_RLS_RSN_CD, retCurrent.getString(KK0081ETMsg.SVC_STP_RLS_RSN_CD));

		// 休止中断コード	PAUSE_STP_CD
		inETMsgSvcKei.set(KK0081ETMsg.PAUSE_STP_CD, retCurrent.getString(KK0081ETMsg.PAUSE_STP_CD));

		// サービス休止年月日	SVC_PAUSE_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_PAUSE_YMD, retCurrent.getString(KK0081ETMsg.SVC_PAUSE_YMD));

		// サービス休止理由コード	SVC_PAUSE_RSN_CD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_PAUSE_RSN_CD, retCurrent.getString(KK0081ETMsg.SVC_PAUSE_RSN_CD));

		// サービス休止理由メモ	SVC_PAUSE_RSN_MEMO
		inETMsgSvcKei.set(KK0081ETMsg.SVC_PAUSE_RSN_MEMO, retCurrent.getString(KK0081ETMsg.SVC_PAUSE_RSN_MEMO));

		// サービス休止解除年月日	SVC_PAUSE_RLS_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_PAUSE_RLS_YMD, retCurrent.getString(KK0081ETMsg.SVC_PAUSE_RLS_YMD));

		// サービス休止解除理由コード	SVC_PAUSE_RLS_RSN_CD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_PAUSE_RLS_RSN_CD, retCurrent.getString(KK0081ETMsg.SVC_PAUSE_RLS_RSN_CD));

		// サービス休止解除理由メモ	SVC_PAUSE_RLS_RSN_MEMO
		inETMsgSvcKei.set(KK0081ETMsg.SVC_PAUSE_RLS_RSN_MEMO, retCurrent.getString(KK0081ETMsg.SVC_PAUSE_RLS_RSN_MEMO));

		// サービス終了年月日	SVC_ENDYMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_ENDYMD, JKKModelCommon.getYmdDslFix(inCBSMsg, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD)));

		//2015-5-28　中原　ANK-2480-00-00 新電力対応 MOD START
		// サービス課金終了年月日	SVC_CHRG_ENDYMD
//		// 「サービス契約」が"ＭＶＮＯサービス"の場合
//		if(JKKModelCommon.isEqualsSvcKK2821(inCBSMsg, inContext, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_KEI_NO), "51"))
		// 「サービス契約」が"ＭＶＮＯサービス" または "電気サービス"の場合
		if(JKKModelCommon.isEqualsSvcKK2821(inCBSMsg, inContext, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_KEI_NO), "51,05"))
		//2015-5-28　中原　ANK-2480-00-00 新電力対応 MOD END
		{
			inETMsgSvcKei.set(KK0081ETMsg.SVC_CHRG_ENDYMD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_CHRG_ENDYMD));
		}
		else
		{
		inETMsgSvcKei.set(KK0081ETMsg.SVC_CHRG_ENDYMD, 
				JKKModelCommon.addDay(inCBSMsg, inContext, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD), "-1"));
		}

		// サービス解約起算年月日	SVC_DSL_KISAN_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_DSL_KISAN_YMD, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_DSL_KISAN_YMD));

		//2015-5-28　中原　ANK-2480-00-00 新電力対応 MOD START
//		//ＭＶＮＯから連携される場合
//		if(JKKModelCommon.isEqualsSvcKK2821(inCBSMsg, inContext, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_KEI_NO), "51"))
		//ＭＶＮＯ または 電気サービスから連携される場合
		if(JKKModelCommon.isEqualsSvcKK2821(inCBSMsg, inContext, inCBSMsg.getObject(EKK0081C260CBSMsg.SVC_KEI_NO), "51,05"))
		//2015-5-28　中原　ANK-2480-00-00 新電力対応 MOD END
		{
			// サービス解約年月日	SVC_DSL_YMD
			inETMsgSvcKei.set(KK0081ETMsg.SVC_DSL_YMD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_DSL_YMD_I));
		}
		else 
		{
			// サービス解約年月日	SVC_DSL_YMD
			inETMsgSvcKei.set(KK0081ETMsg.SVC_DSL_YMD, JKKModelCommon.getYmdDslFix(inCBSMsg, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_ENDYMD)));
		}

		// サービス解約理由コード	SVC_DLRE_CD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_DLRE_CD, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_DLRE_CD));

		// サービス解約理由メモ	SVC_DLRE_MEMO
		inETMsgSvcKei.set(KK0081ETMsg.SVC_DLRE_MEMO, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_DLRE_MEMO));

		// サービスキャンセル取消年月日	SVC_CANCEL_CL_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_CANCEL_CL_YMD, retCurrent.getString(KK0081ETMsg.SVC_CANCEL_CL_YMD));

		// 変更元法人サービス契約受付番号	CHGE_MT_HOJINSVKEI_UK_NO
		inETMsgSvcKei.set(KK0081ETMsg.CHGE_MT_HOJINSVKEI_UK_NO, retCurrent.getString(KK0081ETMsg.CHGE_MT_HOJINSVKEI_UK_NO));

		// 変更元法人サービス契約受付番号子	CHGE_MT_HOJINSVKEI_UK_NOPT
		inETMsgSvcKei.set(KK0081ETMsg.CHGE_MT_HOJINSVKEI_UK_NOPT, retCurrent.getString(KK0081ETMsg.CHGE_MT_HOJINSVKEI_UK_NOPT));

		// 変更先法人サービス契約受付番号	CHGE_SK_HOJINSVKEI_UK_NO
		inETMsgSvcKei.set(KK0081ETMsg.CHGE_SK_HOJINSVKEI_UK_NO, retCurrent.getString(KK0081ETMsg.CHGE_SK_HOJINSVKEI_UK_NO));

		// 変更先法人サービス契約受付番号子	CHGE_SK_HOJINSVKEI_UK_NOPT
		inETMsgSvcKei.set(KK0081ETMsg.CHGE_SK_HOJINSVKEI_UK_NOPT, retCurrent.getString(KK0081ETMsg.CHGE_SK_HOJINSVKEI_UK_NOPT));

		// 変更元法人eo読替サービス契約番号	CHMT_HJIN_EO_YKAE_SVKEI_NO
		inETMsgSvcKei.set(KK0081ETMsg.CHMT_HJIN_EO_YKAE_SVKEI_NO, retCurrent.getString(KK0081ETMsg.CHMT_HJIN_EO_YKAE_SVKEI_NO));

		// 変更先法人eo読替サービス契約番号	CHSK_HJIN_EO_YKAE_SVKEI_NO
		inETMsgSvcKei.set(KK0081ETMsg.CHSK_HJIN_EO_YKAE_SVKEI_NO, retCurrent.getString(KK0081ETMsg.CHSK_HJIN_EO_YKAE_SVKEI_NO));

		// 法人サービス契約引継ぎ種別コード HOJINSVKEI_HKTGI_SBT_CD
		inETMsgSvcKei.set(KK0081ETMsg.HOJINSVKEI_HKTGI_SBT_CD, inCBSMsg.getObject(EKK0081C260CBSMsg.HOJINSVKEI_HKTGI_SBT_CD));

		// 違約金発生コード	PNLTY_HASSEI_CD
		inETMsgSvcKei.set(KK0081ETMsg.PNLTY_HASSEI_CD, pnlty_hassei_cd);

		// 違約金変更理由コード	PNLTY_CHGE_RSN_CD
		inETMsgSvcKei.set(KK0081ETMsg.PNLTY_CHGE_RSN_CD, retCurrent.getString(KK0081ETMsg.PNLTY_CHGE_RSN_CD));

		// 異動区分	IDO_DIV
		inETMsgSvcKei.set(KK0081ETMsg.IDO_DIV, ido_div);

		// 初期デフォルトパスワード	SHK_DFLT_PWD
		inETMsgSvcKei.set(KK0081ETMsg.SHK_DFLT_PWD, retCurrent.getString(KK0081ETMsg.SHK_DFLT_PWD));

		// お客さまIDパスワード CUST_ID_PWD
		inETMsgSvcKei.set(KK0081ETMsg.CUST_ID_PWD, retCurrent.getString(KK0081ETMsg.CUST_ID_PWD));

		// 面開発案件仮登録フラグ	MENKAIHAT_ANKEN_KR_ADD_FLG
		inETMsgSvcKei.set(KK0081ETMsg.MENKAIHAT_ANKEN_KR_ADD_FLG, retCurrent.getString(KK0081ETMsg.MENKAIHAT_ANKEN_KR_ADD_FLG));

		// 紹介コード	INTR_CD
		inETMsgSvcKei.set(KK0081ETMsg.INTR_CD, retCurrent.getString(KK0081ETMsg.INTR_CD));

		// 照査解約完了コード	SHOSA_DSL_FIN_CD
		inETMsgSvcKei.set(KK0081ETMsg.SHOSA_DSL_FIN_CD, retCurrent.getString(KK0081ETMsg.SHOSA_DSL_FIN_CD));

		// 異動NG状態コード	IDO_NG_STAT_CD
		inETMsgSvcKei.set(KK0081ETMsg.IDO_NG_STAT_CD, retCurrent.getString(KK0081ETMsg.IDO_NG_STAT_CD));

		// 課金開始年月日補正有無	CHRG_STA_YMD_HOSEI_UM
		inETMsgSvcKei.set(KK0081ETMsg.CHRG_STA_YMD_HOSEI_UM, retCurrent.getString(KK0081ETMsg.CHRG_STA_YMD_HOSEI_UM));

		// サービス休止課金開始年月日	SVC_PAUSE_CHRG_STA_YMD
		inETMsgSvcKei.set(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD, retCurrent.getString(KK0081ETMsg.SVC_PAUSE_CHRG_STA_YMD));

		// 業務連絡備考	WORK_RRK_BIKO
		inETMsgSvcKei.set(KK0081ETMsg.WORK_RRK_BIKO, retCurrent.getString(KK0081ETMsg.WORK_RRK_BIKO));

		// 自動照査処理状態コード	AUTO_SHOSA_TRAN_STAT_CD
		inETMsgSvcKei.set(KK0081ETMsg.AUTO_SHOSA_TRAN_STAT_CD, retCurrent.getString(KK0081ETMsg.AUTO_SHOSA_TRAN_STAT_CD));

		// 機器未登録リスト出力済フラグ	KIKI_MIADD_LIST_OPUTZM_FLG
		inETMsgSvcKei.set(KK0081ETMsg.KIKI_MIADD_LIST_OPUTZM_FLG, retCurrent.getString(KK0081ETMsg.KIKI_MIADD_LIST_OPUTZM_FLG));

		// 回復不可契約抽出済フラグ	KAIHK_FAIL_KEI_CST_ZM_FLG
		inETMsgSvcKei.set(KK0081ETMsg.KAIHK_FAIL_KEI_CST_ZM_FLG, retCurrent.getString(KK0081ETMsg.KAIHK_FAIL_KEI_CST_ZM_FLG));

		// サービス提供物消去処理実施年月日時分秒	SVCTK_BUT_DEL_TRN_JSSI_DTM
		inETMsgSvcKei.set(KK0081ETMsg.SVCTK_BUT_DEL_TRN_JSSI_DTM, retCurrent.getString(KK0081ETMsg.SVCTK_BUT_DEL_TRN_JSSI_DTM));

		// 従量超過通知要否	JURYO_CHOK_TCHI_YH
		inETMsgSvcKei.set(KK0081ETMsg.JURYO_CHOK_TCHI_YH, retCurrent.getString(KK0081ETMsg.JURYO_CHOK_TCHI_YH));

		// 登録年月日時分秒	ADD_DTM
		inETMsgSvcKei.set(KK0081ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));

		// 登録オペレータアカウント	ADD_OPEACNT
		inETMsgSvcKei.set(KK0081ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		// 更新年月日時分秒	UPD_DTM
		inETMsgSvcKei.set(KK0081ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));

		// 更新オペレータアカウント	UPD_OPEACNT
		inETMsgSvcKei.set(KK0081ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		// 無効フラグ	MK_FLG
		inETMsgSvcKei.set(KK0081ETMsg.MK_FLG, "0");

		// 更新処理の実行
		JKKejbDBAUtil dbaUtil0081 = new JKKejbDBAUtil(inCBSMsg);
		dbaUtil0081.create(inETMsgSvcKei);

		// 返却項目メッセージ生成
		inCBSMsg.set(EKK0081C260CBSMsg.GENE_ADD_DTM, inETMsgSvcKei.getString(KK0081ETMsg.GENE_ADD_DTM));
		inCBSMsg.set(EKK0081C260CBSMsg.SVC_KEI_STAT, inETMsgSvcKei.getString(KK0081ETMsg.SVC_KEI_STAT));
		inCBSMsg.set(EKK0081C260CBSMsg.UPD_DTM, inETMsgSvcKei.getString(KK0081ETMsg.UPD_DTM));
		inCBSMsg.set(EKK0081C260CBSMsg.UPD_OPEACNT, inETMsgSvcKei.getString(KK0081ETMsg.UPD_OPEACNT));
		inCBSMsg.set(EKK0081C260CBSMsg.SVC_DSL_YMD, inETMsgSvcKei.getString(KK0081ETMsg.SVC_DSL_YMD));
		
		// 遡及解約対応
		// 履歴レコードにおいて、時系列順にて日付が逆転してしまう課金終了日の更新処理を行う
		updRirekiKK0081(inCBSMsg, inContext, inETMsgSvcKei.getString(KK0081ETMsg.PLAN_CHRG_ENDYMD));
	}
	/**
	 * <p>
	 * 遡及解約対応・履歴レコード課金終了日更新処理
	 * 遡及解約により、解約(最新)レコードの課金終了日に対して、履歴レコードの課金終了日が未来日になってしまう場合に、
	 * 解約(最新)レコードの課金終了日と同日を履歴レコードの課金終了日に設定する。
	 * </p>
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param planChrgEndymd 新規レコードのプラン課金終了年月日
	 */
	private void updRirekiKK0081(CAANMsg inCBSMsg, AgentDispatchContext inContext, String planChrgEndymd)
	{
		// プラン課金終了日が設定されている履歴レコードを取得する。
		// 条件：プラン終了種別コード＝"プラン変更に伴う終了"
		CAANMsg conInMsg = new CAANMsg(KK0081ETMsg.class.getName());
		conInMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C260CBSMsg.SVC_KEI_NO));
		conInMsg.set(KK0081ETMsg.PLAN_END_SBT_CD, PLAN_END_SBT_CD_PLAN_CHANGE);
		conInMsg.set(KK0081ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] conRetMsg = null;
		try
		{
			conRetMsg = new KK0081LE().findByCondition(conInMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		// 取得できない場合は処理を終了する
		if (null == conRetMsg || conRetMsg.length == 0)
		{
			return;
		}

		// 当該サービスIFにて作成した解約(最新)レコードの世代登録年月日時分秒
		String geneAddDtm = inCBSMsg.getString(EKK0081C260CBSMsg.GENE_ADD_DTM);

		/* ----------------------------------------------------------------------------------------------------
		 * 履歴レコード.プラン課金終了年月日更新処理
		 * 条件：解約(最新)レコード.プラン課金終了年月日＜履歴レコード.プラン課金終了年月日
		 * ---------------------------------------------------------------------------------------------------- */
		for (CAANMsg retMsg : conRetMsg)
		{
			// 当該サービスIFにて作成した解約(最新)レコードは、更新対象外
			if (geneAddDtm.equals(retMsg.getString(KK0081ETMsg.GENE_ADD_DTM)))
			{
				continue;
			}

			// 履歴レコード.プラン課金終了年月日
			String workPlanChrgEndymd = retMsg.getString(KK0081ETMsg.PLAN_CHRG_ENDYMD);
			// 履歴レコード.プラン課金終了年月日が未設定または"20991231"の場合は処理しない
			if (null == workPlanChrgEndymd || "".equals(workPlanChrgEndymd) || YMD_SHKV.equals(workPlanChrgEndymd))
			{
				continue;
			}

			// 解約(最新)レコード.プラン課金終了年月日＜履歴レコード.プラン課金終了年月日の場合
			if (JPCUtilCommon.isFutureDate(workPlanChrgEndymd, planChrgEndymd, "0"))
			{
				retMsg.set(KK0081ETMsg.PLAN_CHRG_ENDYMD, planChrgEndymd);
				retMsg.set(KK0081ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
				retMsg.set(KK0081ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
			}
			else
			{
				continue;
			}

			JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inCBSMsg);
			dbaUtil.update(retMsg);
		}
	}
}
