/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK1681C030ETDA
*   ソースファイル名：JEKK1681C030ETDA.java
*   作成者          ：富士通
*	日付			：2014年08月15日
*＜機能概要＞
*   異動予約更新（交換希望日変更）のDBアクセス部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v10.00.00	2014/08/15	富士通		新規作成(ANK-2141-00-00)
**********************************************************************/

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.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK1681C030CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;

/**
 * <p>
 * 異動予約更新（交換希望日変更）のDBアクセス部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK1681C030ETDA
{
	/** 関連チェックエラーフラグ&エラー返却項目(異動予約 STB異動予約存在チェック) */
	private static final String[] KRCK_STB_IDORSV_EXISTS_ERR = {"EA", EKK1681C030CBSMsg.KKTK_SVC_KEI_NO_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(異動予約 C-CAS異動予約存在チェック) */
	private static final String[] KRCK_CCAS_IDORSV_EXISTS_ERR = {"EB", EKK1681C030CBSMsg.KKTK_SVC_KEI_NO_ERR};
	
	/**
	 * <p>
	 * 新しいJEKK1681C030ETDAを作成します。
	 * </p>
	 */
	public JEKK1681C030ETDA()
	{
	}

	/**
	 * <p>
	 * カレントの機器提供サービス契約の機器変更番号に変わる直前のレコードの状態を機器提供サービス契約に登録します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		try
		{
			// 機器提供サービス契約番号
			String kktkSvcKeiNo = inCBSMsg.getString(EKK1681C030CBSMsg.KKTK_SVC_KEI_NO);

			// 異動予約メッセージインスタンスを生成
			CAANMsg inMsg = new CAANMsg(KK1681ETMsg.class.getName());
			
			// 機器提供サービス契約番号に紐付く異動予約番号を取得するためにメッセージを生成
			inMsg.set(KK1681ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
			inMsg.set(KK1681ETMsg.NEW_KIKI_CHG_NO, inCBSMsg.getString(EKK1681C030CBSMsg.NEW_KIKI_CHG_NO));
			inMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, JKKModelConst.IDO_RSV_DTL_CD_STB_DIRECT_SHIPMENT);
			inMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, JKKModelConst.IDO_RSV_STAT_CD_MI_HANEI);
			inMsg.set(KK1681ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

			// KK1681LEインスタンスの生成
			KK1681LE kk1681le = new KK1681LE();
			
			// ロジカルエンティティを生成し、異動予約を検索
			CAANMsg[] kk1681StbMsgList = kk1681le.findByCondition(inMsg);

			// 取得件数が1件でない場合はエラー
			if (kk1681StbMsgList == null || kk1681StbMsgList.length != 1)
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_STB_IDORSV_EXISTS_ERR);
				return;
			}
			
			// 予約適用年月日の算出
			String rsvAplyYmd = inCBSMsg.getString(EKK1681C030CBSMsg.NEW_KIKI_USE_STA_KIBO_YMD).substring(0, 6);
			rsvAplyYmd = rsvAplyYmd + JPCUtilCommon.getEndOfMonth(rsvAplyYmd);

			// STBの異動予約を更新
			CAANMsg updateInfoStb =  makeKK1681ETMsg(inCBSMsg, 
					kk1681StbMsgList[0].getString(KK1681ETMsg.IDO_RSV_NO), rsvAplyYmd);
			update(inCBSMsg, updateInfoStb);
			
			// 出力項目の設定
			setOutputItem(inCBSMsg, updateInfoStb);

			// 異動予約DBアクセス部品
			JKKejbKK1681DBABase kk1681dba = new JKKejbKK1681DBABase();

			// 機器提供サービス契約からサービス契約内訳に紐づくC-CASの異動予約を取得
			CAANMsg[] kk1681CCasMsgList = kk1681dba.getIdoRsvCCas(kktkSvcKeiNo, JKKModelCommon.getOpeDate(inCBSMsg));

			// 取得件数が2件以上存在する場合はエラー
			if (kk1681CCasMsgList == null || kk1681CCasMsgList.length > 1)
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_CCAS_IDORSV_EXISTS_ERR);
				return;
			}
			
			if (kk1681CCasMsgList.length == 1)
			{
				// C-CASの異動予約を更新
				CAANMsg updateInfoCCas =  makeKK1681ETMsg(inCBSMsg, 
						kk1681CCasMsgList[0].getString(KK1681ETMsg.IDO_RSV_NO), rsvAplyYmd);
				update(inCBSMsg, updateInfoCCas);
			}
		}
		catch(CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}		
	}
	
	/**
	 * <p>
	 * DBの更新を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inETMsg 登録対象DBのメッセージキャリア(ETメッセージ)
	 */
	private void update(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		JKKejbDBAUtil dba = new JKKejbDBAUtil(inCBSMsg);
		
		// レコード更新
		dba.update(inETMsg);
	}

	
	/**
	 * <p>
	 * 異動予約に設定するETメッセージを作成します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param idoRsvNo 異動予約番号
	 * @return サービス契約に設定する内容が設定されたETメッセージ
	 */
	private CAANMsg makeKK1681ETMsg(CAANMsg inCBSMsg, String idoRsvNo, String rsvAplyYmd)
	{
		// 異動予約メッセージインスタンスを生成
		CAANMsg inETMsg = new CAANMsg(KK1681ETMsg.class.getName());
		
		// 異動予約番号
		inETMsg.set(KK1681ETMsg.IDO_RSV_NO, idoRsvNo);
		
		// 予約適用年月日	
		inETMsg.set(KK1681ETMsg.RSV_APLY_YMD, rsvAplyYmd);
		
		// 新機器使用開始希望年月日
		inETMsg.set(KK1681ETMsg.NEW_KIKI_USE_STA_KIBO_YMD, inCBSMsg.getString(EKK1681C030CBSMsg.NEW_KIKI_USE_STA_KIBO_YMD));
		
		// 更新年月日時分秒
		inETMsg.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		
		// 更新オペレータアカウント
		inETMsg.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		return inETMsg;
	}
	
	/**
	 * <p>
	 * CBSメッセージの出力項目に値を設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inETMsg DBに設定した内容を持っているETメッセージ
	 */
	private void setOutputItem(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		inCBSMsg.set(EKK1681C030CBSMsg.RSV_APLY_YMD, inETMsg.getString(KK0341ETMsg.RSV_APLY_YMD));
		inCBSMsg.set(EKK1681C030CBSMsg.UPD_DTM, inETMsg.getString(KK0341ETMsg.UPD_DTM));
		inCBSMsg.set(EKK1681C030CBSMsg.UPD_OPEACNT, inETMsg.getString(KK0341ETMsg.UPD_OPEACNT));
	}
	
	/**
	 * <p>
	 * エラー返却項目にエラーフラグを設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param status エラー時のステータス
	 * @param errInfo[] エラー情報が設定された配列 [0]:エラーフラグ [1]:エラー返却項目
	 */
	private void setErrInfo(CAANMsg inCBSMsg, int status, String[] errInfo)
	{
		inCBSMsg.set(JCMConstants.STATUS_INT_KEY, status);
		inCBSMsg.set(errInfo[1], errInfo[0]);
		return;
	}
}
