/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JECK0031C020ETDA
*	ソースファイル名：JECK0031C020ETDA.java
*	作成者			：富士通
*	日付			：2014年08月08日
*＜機能概要＞
*	お客様<法人>内容変更２のDBアクセスを行う部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v9.00.00	2014/08/08	富士通		新規作成(OM-2014-0002399)
*   v25.00.00	2016/07/11	FJ)中原		ANK-2661-01-00 未来予約データ取消し処理改善
*
**********************************************************************/

package eo.ejb.common.db;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbs.cbsmsg.ECK0031C020CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;

/**
 * <p>
 * お客様<法人>内容変更２のDBアクセス処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JECK0031C020ETDA
{

	/** 異動区分_お客様情報変更 */
	private static final String IDO_KBN_CUST_INFO_CHANGE = "00012";

	/** 異動予約詳細コード_お客様情報変更／併合／分割 */
	private static final String IDO_DTLCD_CUST_MIX_SPLIT = "001";

	/** 異動予約状態コード_異動予約対象外 */
	private static final String IDO_STATCD_OUT_TARGET = "04";

	/** 無効フラグ_有効 */
	private static final String MK_FLG_VALID = "0";

	/**
	 * コンストラクタです。
	 */
	public JECK0031C020ETDA()
	{
	}

	/**
	 * <p>
	 * お客様<法人>内容変更２のDBアクセス処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String rsvAplyYmd = inCBSMsg.getString(ECK0031C020CBSMsg.RSV_APLY_YMD); // 予約適用年月日

		// 20160711 ANK-2661-01-00 未来予約データ取消し処理改善 ADD START
		JCKejbCK0011SecProc instance = new JCKejbCK0011SecProc();
		// お客様予約取消処理を実行する場合
		if (instance.isCancelCustRsv(inCBSMsg, inContext))
		{
		// 20160711 ANK-2661-01-00 未来予約データ取消し処理改善 ADD END
			// 異動予約に存在するお客様予約の取り消し
			cancelCustRsv(inCBSMsg, inContext);
		// 20160711 ANK-2661-01-00 未来予約データ取消し処理改善 ADD START
		}
		// 20160711 ANK-2661-01-00 未来予約データ取消し処理改善 ADD END

		if (null == rsvAplyYmd)
		{
			return;
		}

		if (JKKModelCommon.isFutureDateKRCK(inCBSMsg, inContext, rsvAplyYmd, 0))
		{
			// 異動予約の登録処理の呼出し
			createIdoRsv(inCBSMsg, inContext);
		}
	}

	/**
	 * <p>
	 * 異動予約に存在するお客様予約の取り消しを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	*/
	private void cancelCustRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String sysid = inCBSMsg.getString(ECK0031C020CBSMsg.SYSID); // SYSID
		String rsvAplyYmd = inCBSMsg.getString(ECK0031C020CBSMsg.RSV_APLY_YMD); // 予約適用年月日

		JKKejbIdoRsvDBAUtil idoRsvDbUtil = new JKKejbIdoRsvDBAUtil();

		// 取消対象レコードの取得
		CAANMsg[] targetMsgs = idoRsvDbUtil.getCustRsvInIdoRsv(inCBSMsg, inContext, sysid, rsvAplyYmd);

		// 対象レコードの更新
		for (CAANMsg targetMsg : targetMsgs)
		{
			idoRsvDbUtil.cancelCustRsvInIdoRsv(inCBSMsg, inContext, targetMsg);
			
			// 自動予約取消ワークに登録します
			this.createKK2791IdoRsv(targetMsg, JKKModelConst.AUTO_RSV_CL_STAT_CD_CL_ZM, inCBSMsg);
		}
	}

	/**
	 * <p>
	 * 自動予約取消ワークに異動予約の予約情報を登録します
	 * </p>
	 * @param kk1681EtMsg ETメッセージ
	 * @param autoRsvClStatCd 自動予約取消状態コード
 	 * @param inCBSMsg 入力情報
	 */
	private void createKK2791IdoRsv(CAANMsg kk1681EtMsg, String autoRsvClStatCd, CAANMsg inCBSMsg)
	{
		// 自動予約取消ワークＤＢ操作部品のインスタンス化
		JKKejbKK2791ETDA kk2791etda = new JKKejbKK2791ETDA();

		// 取消契機異動区分
		kk2791etda.setCl_opty_ido_div(JKKModelConst.IDO_DIV_CUST_CHG);
		// 登録年月日時分秒
		kk2791etda.setAdd_dtm(inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		// 登録オペレータアカウント
		kk2791etda.setAdd_opeacnt(inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		// 更新年月日時分秒
		kk2791etda.setUpd_dtm(inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));		
		// 更新オペレータアカウント
		kk2791etda.setUpd_opeacnt(inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		// 自動予約取消ワークの登録
		kk2791etda.createKK2791(kk1681EtMsg, "KK1681", autoRsvClStatCd);
	}

	/**
	 * <p>
	 * 異動予約の登録処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	private void createIdoRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{

		// 異動予約番号の採番
		String idoRsvNo = JKKModelCommon.getIdoRsvNoKK1681(inCBSMsg, inContext);

		// 異動予約の登録
		CAANMsg inEtMsg1681 = new CAANMsg(KK1681ETMsg.class.getName());
		inEtMsg1681.set(KK1681ETMsg.IDO_RSV_NO, idoRsvNo);
		inEtMsg1681.set(KK1681ETMsg.IDO_DIV, IDO_KBN_CUST_INFO_CHANGE);
		inEtMsg1681.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDO_DTLCD_CUST_MIX_SPLIT);
		inEtMsg1681.set(KK1681ETMsg.RSV_APLY_YMD, inCBSMsg.getString(ECK0031C020CBSMsg.RSV_APLY_YMD));
		inEtMsg1681.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDO_STATCD_OUT_TARGET);
		inEtMsg1681.set(KK1681ETMsg.SYSID, inCBSMsg.getString(ECK0031C020CBSMsg.SYSID));
		inEtMsg1681.set(KK1681ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inEtMsg1681.set(KK1681ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		inEtMsg1681.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inEtMsg1681.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		inEtMsg1681.set(KK1681ETMsg.MK_FLG, MK_FLG_VALID);

		JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inCBSMsg);
		dbaUtil.create(inEtMsg1681);
	}
}
