/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JEKK0401C170ETDA
 *	ソースファイル名：JEKK0401C170ETDA.java
 *	作成者			：富士通
 *	日付			：2011年10月19日
 *＜機能概要＞
 *	サブオプションサービス契約 ETMsgDBアクセス部品
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *
 ********************************************************************************/

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.CAANMsg;
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.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0401C170CBSMsg;
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>
 * サブオプションサービス契約解約ETMsgDBアクセス部品です。
 * </p>
 * @author 富士通
 */
public class JEKK0401C170ETDA 
{

	/**
	 * コンストラクタ
	 */
	public JEKK0401C170ETDA()
	{
	}

	/** 異動予約詳細コード：サブオプション解約 */
	private static final String IDO_RSV_CD_SVC_DSL = "018";
	/** 異動予約状態コード：予約手続中 */
	private static final String IDO_RSV_STAT_CD_RSV_TETUDUKI = "03"; 
	/** 異動予約スキーマID */
	private static final String IDO_RSV_SCHEMA_ID = "KK1681";
	/** 無効フラグ 有効 */
	private static final String MK_FLG_VALID = "0";

	/**
	 * 相関ルール振舞判定を行い、DBアクセス部品を呼び出す
	 * 
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		
		// ルールエンジン格納結果用リスト
		ArrayList<HashMap<String, Object>> rsltList = null;

		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JEKK0401C170ETDA.execDBAccess");

		// ルールエンジンインスタンスの生成
		JKKejbRule0083001 jkRule0083 = new JKKejbRule0083001(inCBSMsg);

		// ルールエンジン用入力値設定
		jkRule0083.setSvc_if_id(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY));
		jkRule0083.setBase_date(inCBSMsg.getString(EKK0401C170CBSMsg.SVC_ENDYMD));
		jkRule0083.setOpe_date((String)JKKModelCommon.getOpeDate(inCBSMsg, inContext));

		// ルールエンジン実行
		rsltList = jkRule0083.referRuleEngine();

		if (null == rsltList)
		{
			// 相関ルールチェックの結果が0件の場合はエラーとする
			inCBSMsg.set(EKK0401C170CBSMsg.IDO_DIV_ERR, "EA");
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.TEMPLATE_CORRELATION_ERR);
			return;
		}

		// 相関ルールチェック結果を格納
		new JKKejbIdoRsvUtil().setOnlyIdoRsvFlg(inCBSMsg, inContext, rsltList);

		// メッセージ変換を行いDBアクセスを行う
		for(HashMap<String, Object> rs : rsltList)
		{
			execDBAccess(inCBSMsg, rs, inContext);
		}

		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JEKK0401C170ETDA.execDBAccess");
	}

	/**
	 * DBAccessを行う
	 * 
	 * @param  inCBSMsg 入力パラメータのCBSMsg
	 * @param  rs       ルールエンジン実行結果格納マップ
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 */
	private void execDBAccess(CAANMsg inCBSMsg, HashMap<String, Object> rs, AgentDispatchContext inContext)
	{
		// ルールエンジンの振舞対象スキーマが異動予約の場合
		if (IDO_RSV_SCHEMA_ID.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(EKK0401C170CBSMsg.IDO_DIV));

			// 異動予約詳細コード	IDO_RSV_DTL_CD
			inETMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDO_RSV_CD_SVC_DSL);

			// 予約適用年月日	RSV_APLY_YMD
			String rsv_aply_ymd = JKKejbEditYmdInit.convRsvAplyYmdInit(inCBSMsg.getString(EKK0401C170CBSMsg.SVC_ENDYMD));
			inETMsg.set(KK1681ETMsg.RSV_APLY_YMD, rsv_aply_ymd);

			// 異動予約状態コード	IDO_RSV_STAT_CD
			inETMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDO_RSV_STAT_CD_RSV_TETUDUKI);

			// 申込明細番号	MSKM_DTL_NO
			inETMsg.set(KK1681ETMsg.MSKM_DTL_NO, inCBSMsg.getString(EKK0401C170CBSMsg.MSKM_DTL_NO));

			//2011.10.26 仕様変更のため、コメントアウト
			// オプションサービス契約番号	OP_SVC_KEI_NO
			//inETMsg.set(KK1681ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0401C170CBSMsg.OP_SVC_KEI_NO));

			// サブオプションサービス契約番号	SBOP_SVC_KEI_NO
			inETMsg.set(KK1681ETMsg.SBOP_SVC_KEI_NO, inCBSMsg.getString(EKK0401C170CBSMsg.SBOP_SVC_KEI_NO));

			// 違約金発生コード	PNLTY_HASSEI_CD
			inETMsg.set(KK1681ETMsg.PNLTY_HASSEI_CD, inCBSMsg.getString(EKK0401C170CBSMsg.PNLTY_HASSEI_CD));

			// Input．オプション引継先サービス契約番号が存在している場合
			if (!inCBSMsg.isNull(EKK0401C170CBSMsg.OP_HKTGI_SK_SVC_KEI_NO))
			{
				// Input．オプション引継先サービス契約番号を設定
				inETMsg.set(KK1681ETMsg.OP_HKTGI_SK_SVC_KEI_NO, inCBSMsg.getString(EKK0401C170CBSMsg.OP_HKTGI_SK_SVC_KEI_NO));				
			}

			// 登録年月日時分秒	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(EKK0401C170CBSMsg.ADD_DTM, inETMsg.getString(KK1681ETMsg.ADD_DTM));
			inCBSMsg.set(EKK0401C170CBSMsg.ADD_OPEACNT, inETMsg.getString(KK1681ETMsg.ADD_OPEACNT));
			inCBSMsg.set(EKK0401C170CBSMsg.UPD_DTM, inETMsg.getString(KK1681ETMsg.UPD_DTM));
			inCBSMsg.set(EKK0401C170CBSMsg.UPD_OPEACNT, inETMsg.getString(KK1681ETMsg.UPD_OPEACNT));
			inCBSMsg.set(EKK0401C170CBSMsg.MK_FLG, inETMsg.getString(KK1681ETMsg.MK_FLG));
		}
	}
}