/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0341C170ETDA
*   ソースファイル名：JEKK0341C170ETDA.java
*   作成者          ：富士通
*   日付            ：2011年10月12日
*＜機能概要＞
*   機器提供サービス契約料金コース変更中止DBアクセス処理部品です。
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/10/12  富士通      新規作成
*
**********************************************************************/

package eo.ejb.common.db;

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.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK0341C170CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 機器提供サービス契約料金コース変更中止DBアクセス処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0341C170ETDA
{
	/** 異動予約詳細コード 機器コース変更 */
	private static final String DTLCD_KKCRSCHNG = "011";
	
	/** 異動予約状態コード 取消済 */
	private static final String STATCD_CANCEL = "02";
	
	/** 異動予約状態コード 異動予約対象外 */
	private static final String STATCD_OUT_TARGET = "04";
	
	/** 日付：最大値 */
	private static final String DATE_MAX = "20991231";
	
	/** 機器提供サービスコード（BBR） */
	private static final String KKTK_SVC_CD_BBR = "C014";
	
	/** 異動区分（機器機種変更） */
	private static final String IDO_DIV_KKCNG = "00028";
	
	/**
	 * コンストラクタです。
	 */
	public JEKK0341C170ETDA()
	{
	}

	/**
	 * <p>
	 * 機器提供サービス契約料金コース変更中止DBアクセス処理
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// カレントレコードの取得処理
		CAANMsg curRetMsg = this.findByCurrentKK0341(inCBSMsg, inContext);
		
		// EE対応表の条件の判定(機器提供サービス契約の更新)
		if (checkJokenForUpdate0341(inCBSMsg, inContext, curRetMsg))
		{
			// 機器提供サービス契約のカレントレコードを更新
			update0341(inCBSMsg, inContext, curRetMsg);
		}

		// 異動予約の更新処理の呼び出し
		updateIdoRsv(inCBSMsg);
	}

	/**
	 * <p>
	 * 異動予約のDBアクセスを行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * </p>
	 */
	private void updateIdoRsv(CAANMsg inCBSMsg)
	{

		// 機器提供サービス契約番号に紐づく一覧の取得
		CAANMsg inMsg1681 = new CAANMsg(KK1681ETMsg.class.getName());
		inMsg1681.set(KK1681ETMsg.KKTK_SVC_KEI_NO, inCBSMsg.getString(EKK0341C170CBSMsg.KKTK_SVC_KEI_NO));
		inMsg1681.set(KK1681ETMsg.IDO_RSV_DTL_CD, DTLCD_KKCRSCHNG);
		inMsg1681.set(KK1681ETMsg.IDO_RSV_STAT_CD, STATCD_OUT_TARGET);
		KK1681LE le1681 = new KK1681LE();
		CAANMsg[] outETMsgIdoRsv = null;
		try
		{
			outETMsgIdoRsv = le1681.findByCondition(inMsg1681);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		// 異動予約を更新する
		for (int i = 0; i < outETMsgIdoRsv.length; i++)
		{
			// 予約適用年月日が運用日付より未来日のレコードが対象
			if (0 < outETMsgIdoRsv[0].getString(KK1681ETMsg.RSV_APLY_YMD).compareTo(opeDate))
			{
				CAANMsg inETMsgIdoRsv = new CAANMsg(KK1681ETMsg.class.getName());
				inETMsgIdoRsv.set(KK1681ETMsg.IDO_RSV_NO, outETMsgIdoRsv[i].getString(KK1681ETMsg.IDO_RSV_NO));
				inETMsgIdoRsv.set(KK1681ETMsg.IDO_RSV_CL_YMD, opeDate);
				inETMsgIdoRsv.set(KK1681ETMsg.IDO_RSV_STAT_CD, STATCD_CANCEL);
				inETMsgIdoRsv.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
				inETMsgIdoRsv.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

				JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inCBSMsg);
				dbaUtil.update(inETMsgIdoRsv);
			}
		}
	}
	
	/**
	 * <p>
	 * 機器提供サービス契約の更新処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param curRetMsg 処理対象のカレントレコード
	*/
	private void update0341(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg curRetMsg){
		
		// ETMsgの作成
		CAANMsg inETMsg = new CAANMsg(KK0341ETMsg.class.getName());

		// 機器提供サービス契約番号
		String kktkSvcKeiNo = inCBSMsg.getString(EKK0341C170CBSMsg.KKTK_SVC_KEI_NO);
		
		// 世代登録年月日時分秒
		String geneAddDtm = curRetMsg.getString(KK0341ETMsg.GENE_ADD_DTM);
		
		// 更新データ設定
		// 機器提供サービス契約番号	KKTK_SVC_KEI_NO
		inETMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		
		// 世代登録年月日時分秒	GENE_ADD_DTM
		inETMsg.set(KK0341ETMsg.GENE_ADD_DTM, geneAddDtm);
		
		// プラン終了年月日	PLAN_ENDYMD
		inETMsg.set(KK0341ETMsg.PLAN_ENDYMD, DATE_MAX);
		
		// プラン課金終了年月日	PLAN_CHRG_ENDYMD
		inETMsg.set(KK0341ETMsg.PLAN_CHRG_ENDYMD, DATE_MAX);
		
		// プラン終了種別コード	PLAN_END_SBT_CD
		inETMsg.set(KK0341ETMsg.PLAN_END_SBT_CD, "");
		
		// 更新年月日時分秒	UPD_DTM
		inETMsg.set(KK0341ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		
		// 更新オペレータアカウント	UPD_OPEACNT
		inETMsg.set(KK0341ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		// 機器提供サービス契約の更新
		JKKejbDBAUtil dba = new JKKejbDBAUtil(inCBSMsg);
		dba.update(inETMsg);
	}
	
	/**
	 * <p>
	 * 機器提供サービス契約更新処理の条件チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param curRetMsg 処理対象のカレントレコード
	 * @return チェック結果(OK:true, NG:false)
	*/
	private boolean checkJokenForUpdate0341(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg curRetMsg)
	{
		// カレントレコードが存在しない場合falseを返却
		if (curRetMsg == null)
		{
			return false;
		}
		
		// カレントレコードの機器提供サービスコードが"BBR"、かつ異動区分が"機器機種変更"の場合Trueを返却
		if (KKTK_SVC_CD_BBR.equals(curRetMsg.getString(KK0341ETMsg.KKTK_SVC_CD)) && 
				IDO_DIV_KKCNG.equals(curRetMsg.getString(KK0341ETMsg.IDO_DIV)))
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * <p>
	 * 機器提供サービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @return curRetMsg 処理対象のカレントレコード
	*/
	private CAANMsg findByCurrentKK0341(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String kktkSvcKeiNo = inCBSMsg.getString(EKK0341C170CBSMsg.KKTK_SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		CAANMsg cond = new CAANMsg(KK0341ETMsg.class.getName());
		cond.set(KK0341ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		cond.set(KK0341ETMsg.RSV_APLY_YMD, opeDate);
		
		// 機器提供サービス契約のカレントレコード検索
		CAANMsg curRetMsg = new JKKejbKK0341DBABase().findByCurrent(cond);
				
		return curRetMsg;
	}
}
