/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0341C350ETDA
*   ソースファイル名：JEKK0341C340ETDA.java
*   作成者          ：富士通
*   日付            ：2011年10月19日
*＜機能概要＞
*   機器提供サービス契約解約のDBアクセス部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/10/19  富士通      新規作成
*   v5.00.00    2013/10/24  FJ) 沖田    OM-2013-0002760
*
**********************************************************************/

package eo.ejb.common.db;

import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C340CBSMsg;
import eo.ejb.cbs.mainproc.JKKejbIdoRsvUtil;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.edit.JKKejbEditYmdInit;
import eo.ejb.common.edit.JKKejbKK1681NumberParts;
import eo.ejb.common.rule.JKKejbRule0083001;

/**
 * <p>
 * 機器提供サービス契約解約のDBアクセス部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0341C340ETDA
{
	/** 異動予約詳細コード 機器解約 */
	private static final String DTLCD_KKDISSOLVE = "013";
	
	/** 異動予約状態コード 予約手続中 */
	private static final String STATCD_RSV_PROC = "03";
	
	/** 無効フラグ 有効 */
	private static final String MK_FLG_VALID = "0";
	
	/** スキーマID 異動予約 */
	private static final String SCHEMAID_IDORSV = "KK1681";
	
	/**
	 * <p>
	 * 新しいJEKK0341C340ETDAを作成します。
	 * </p>
	 */
	public JEKK0341C340ETDA()
	{
	}

	/**
	 * <p>
	 * 相関ルールにて振舞判定を行い、異動予約にDBアクセスを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 相関ルールにて振舞うスキーマを判定
		JKKejbRule0083001 rule0083 = new JKKejbRule0083001(inCBSMsg);
		rule0083.setSvc_if_id(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY));
		
		String baseDate = inCBSMsg.getString(EKK0341C340CBSMsg.SVC_ENDYMD);
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		rule0083.setBase_date(baseDate);
		rule0083.setOpe_date(opeDate);
		
		List<HashMap<String, Object>> ruleList = rule0083.referRuleEngine();
		
		if (ruleList == null)
		{
			// 相関ルールチェックの結果が0件の場合はエラーとする
			inCBSMsg.set(EKK0341C340CBSMsg.IDO_DIV_ERR, "EA");
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.TEMPLATE_CORRELATION_ERR);
			return;
		}
		
		// 相関ルールチェック結果を格納
		new JKKejbIdoRsvUtil().setOnlyIdoRsvFlg(inCBSMsg, inContext, ruleList);
		
		for (HashMap<String, Object> hm : ruleList)
		{
			execDBAccess(inCBSMsg, hm, inContext);
		}

	}
	
	/**
	 * DBAccessを行う
	 * 
	 * @param  inCBSMsg 入力パラメータのCBSMsg
	 * @param  rs       ルールエンジン実行結果格納マップ
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 */
	private void execDBAccess(CAANMsg inCBSMsg, HashMap<String, Object> rs, AgentDispatchContext inContext)
	{
		// ルールエンジンの振舞対象スキーマが異動予約の場合
		if (SCHEMAID_IDORSV.equals(rs.get(JKKejbRule0083001.TRGT_SCHEMA_ID)))
		{
			// 採番処理
			JKKejbKK1681NumberParts numberParts = new JKKejbKK1681NumberParts();
			String ido_rsv_no = numberParts.getIdoRsvNo(inCBSMsg, inContext);

			// 異動予約用Msg生成
			CAANMsg inETMsg = new CAANMsg(KK1681ETMsg.class.getName());

			// 異動予約番号	IDO_RSV_NO
			inETMsg.set(KK1681ETMsg.IDO_RSV_NO, ido_rsv_no);

			// 異動区分	IDO_DIV
			inETMsg.set(KK1681ETMsg.IDO_DIV, inCBSMsg.getString(EKK0341C340CBSMsg.IDO_DIV));

			// 異動予約詳細コード	IDO_RSV_DTL_CD
			inETMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, DTLCD_KKDISSOLVE);

			// 予約適用年月日	RSV_APLY_YMD
			String rsv_aply_ymd = JKKejbEditYmdInit.convRsvAplyYmdInit(inCBSMsg.getString(EKK0341C340CBSMsg.SVC_ENDYMD));
			inETMsg.set(KK1681ETMsg.RSV_APLY_YMD, rsv_aply_ymd);

			// 異動予約状態コード	IDO_RSV_STAT_CD
			inETMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, STATCD_RSV_PROC);
			
			// 申込明細番号	MSKM_DTL_NO
			inETMsg.set(KK1681ETMsg.MSKM_DTL_NO, inCBSMsg.getString(EKK0341C340CBSMsg.MSKM_DTL_NO));

			// 機器提供サービス契約番号	KKTK_SVC_KEI_NO
			inETMsg.set(KK1681ETMsg.KKTK_SVC_KEI_NO, inCBSMsg.getString(EKK0341C340CBSMsg.KKTK_SVC_KEI_NO));

			// サービス契約番号	SVC_KEI_NO
			inETMsg.set(KK1681ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0341C340CBSMsg.SVC_KEI_NO));

			// 違約金発生コード	PNLTY_HASSEI_CD
			inETMsg.set(KK1681ETMsg.PNLTY_HASSEI_CD, inCBSMsg.getString(EKK0341C340CBSMsg.PNLTY_HASSEI_CD));

			// 登録年月日時分秒	ADD_DTM
			inETMsg.set(KK1681ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));

			// 登録オペレータアカウント	ADD_OPEACNT
			inETMsg.set(KK1681ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

			// 更新年月日時分秒	UPD_DTM
			inETMsg.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));

			// 更新オペレータアカウント	UPD_OPEACNT
			inETMsg.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

			// 無効フラグ	MK_FLG
			inETMsg.set(KK1681ETMsg.MK_FLG, MK_FLG_VALID);

			// 登録処理の実行
			JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inCBSMsg);
			dbaUtil.create(inETMsg);
			
			// 返却項目メッセージ生成
			inCBSMsg.set(EKK0341C340CBSMsg.ADD_DTM, inETMsg.getString(KK1681ETMsg.ADD_DTM));
			inCBSMsg.set(EKK0341C340CBSMsg.ADD_OPEACNT, inETMsg.getString(KK1681ETMsg.ADD_OPEACNT));
			inCBSMsg.set(EKK0341C340CBSMsg.UPD_DTM, inETMsg.getString(KK1681ETMsg.UPD_DTM));
			inCBSMsg.set(EKK0341C340CBSMsg.UPD_OPEACNT, inETMsg.getString(KK1681ETMsg.UPD_OPEACNT));
			inCBSMsg.set(EKK0341C340CBSMsg.MK_FLG, inETMsg.getString(KK1681ETMsg.MK_FLG));
			
		}
	}
}
