/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0081C100ETDA
*   ソースファイル名：JEKK0081C100ETDA.java
*   作成者          ：富士通
*   日付            ：2011年10月07日
*＜機能概要＞
*   サービス契約手続中料金プラン変更のDBアクセス部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/10/07  富士通      新規作成
*	v5.00.00	2013/02/26	FJ）藤本	ANK-1470-00-00
*   v5.00.01    2013/09/11  FJ）沖田    OM-2013-0001767
*   v5.00.02    2013/09/21  FJ）沖田    OM-2013-0002445
*
**********************************************************************/

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.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.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK0081C100CBSMsg;
import eo.ejb.cbs.mainproc.JKKejbIdoRsvUtil;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.edit.JKKejbKK0081Edit;
import eo.ejb.common.rule.JKKejbRule0083001;

/**
 * <p>
 * サービス契約手続中料金プラン変更のDBアクセス部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0081C100ETDA
{
	/** 異動予約詳細コード コース変更 */
	private static final String DTLCD_CRSCHNG = "003";
	
	/** 異動予約状態コード 予約手続中 */
	private static final String STATCD_RSV_PROC = "03";
	
	/** 無効フラグ 有効 */
	private static final String MK_FLG_VALID = "0";
	
	/** スキーマID サービス契約 */
	private static final String SCHEMAID_SVCKEI = "KK0081";
	
	/** スキーマID 異動予約 */
	private static final String SCHEMAID_IDORSV = "KK1681";
	
	/**
	 * <p>
	 * 新しいJEKK0081C100ETDAを作成します。
	 * </p>
	 */
	public JEKK0081C100ETDA()
	{
	}

	/**
	 * <p>
	 * 相関ルールにて振舞判定を行い、サービス契約または異動予約にDBアクセスを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 相関ルールにて振舞うスキーマを判定
		JKKejbRule0083001 rule0083 = new JKKejbRule0083001(inCBSMsg);
		String svcKeiStat = getCurSvcKei(inCBSMsg, inContext).getString(KK0081ETMsg.SVC_KEI_STAT);
		rule0083.setSvc_if_id(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY));
		rule0083.setKei_stat(svcKeiStat);
		
		List<HashMap<String, Object>> ruleList = rule0083.referRuleEngine();
		
		if (null == ruleList)
		{
			// 相関ルールチェックの結果が0件の場合はエラーとする
			inCBSMsg.set(EKK0081C100CBSMsg.SVC_KEI_NO_ERR, "EA");
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.TEMPLATE_CORRELATION_ERR);
			return;
		}
		
		// 相関ルールチェック結果を格納
		new JKKejbIdoRsvUtil().setOnlyIdoRsvFlg(inCBSMsg, inContext, ruleList);
		
		CAANMsg updateInfo = null;
		
		for (HashMap<String, Object> hm : ruleList)
		{
			if (SCHEMAID_SVCKEI.equals(hm.get(JKKejbRule0083001.TRGT_SCHEMA_ID)))
			{
				// サービス契約に振舞う場合
				updateInfo = makeKK0081ETMsg(inCBSMsg, inContext);
				// 新規レコード
				new JKKejbDBAUtil(inCBSMsg).create(updateInfo);
				
				// サービス契約サブタイプ登録処理の呼び出し
				JKKejbKK0081SubTypeCreate instance = new JKKejbKK0081SubTypeCreate(inCBSMsg);
				instance.setSvcKeiNo(inCBSMsg.getString(EKK0081C100CBSMsg.SVC_KEI_NO));
				instance.setGeneAddDtm(updateInfo.getString(KK0081ETMsg.GENE_ADD_DTM));
				instance.createSubTypeKK0081();
			}
			if (SCHEMAID_IDORSV.equals(hm.get(JKKejbRule0083001.TRGT_SCHEMA_ID)))
			{
				// 異動予約に振舞う場合
				updateInfo = makeKK1681ETMsg(inCBSMsg);
				// DB更新
				new JKKejbDBAUtil(inCBSMsg).update(updateInfo);
			}
			// 出力項目の設定
			setOutputItem(inCBSMsg, updateInfo);
		}
	}

	/**
	 * <p>
	 * 下記条件に該当する異動予約番号を取得します。
	 * <br>・「サービス契約番号」が一致する
	 * <br>・「異動予約詳細コード」が"コース変更"
	 * <br>・「異動予約状態コード」が"予約手続中"
	 * </p>
	 * @param svcKeiNo 検索するサービス契約番号
	 * @return 条件に該当する異動予約番号
	 *          条件に該当する異動予約がない場合、nullを返却
	 */
	private String getIdoRsvNo(String svcKeiNo)
	{
		// サービス契約番号に紐付く「異動予約詳細コード」が"コース変更"で、
		// 「異動予約状態コード」が"予約手続中"で、
		// 「無効フラグ」が"有効"のレコードを取得
		KK1681LE le = new KK1681LE();
		CAANMsg conditionETMsg = new CAANMsg(KK1681ETMsg.class.getName());
		conditionETMsg.set(KK1681ETMsg.SVC_KEI_NO, svcKeiNo);
		conditionETMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, DTLCD_CRSCHNG);
		conditionETMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, STATCD_RSV_PROC);
		conditionETMsg.set(KK1681ETMsg.MK_FLG, MK_FLG_VALID);
		
		CAANMsg[] resultMsg = null;

		try
		{
			resultMsg = le.findByCondition(conditionETMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		// 検索結果の1件目(1件のみ取得する想定)の異動予約番号を返却
		return resultMsg[0].getString(KK1681ETMsg.IDO_RSV_NO);
	}
	
	/**
	 * <p>
	 * サービス契約に設定するETメッセージを作成します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return サービス契約に設定する内容が設定されたETメッセージ
	 */
	private CAANMsg makeKK0081ETMsg(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		
		// サービス契約のカレント
		CAANMsg kk0081ETMsg = getCurSvcKei(inCBSMsg, inContext);
		
		kk0081ETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C100CBSMsg.SVC_KEI_NO));
		kk0081ETMsg.set(KK0081ETMsg.GENE_ADD_DTM, JKKModelCommon.getSysDateTimeStamp());
		kk0081ETMsg.set(KK0081ETMsg.MSKM_DTL_NO, inCBSMsg.getString(EKK0081C100CBSMsg.MSKM_DTL_NO));
		kk0081ETMsg.set(KK0081ETMsg.PRC_GRP_CD, inCBSMsg.getString(EKK0081C100CBSMsg.PRC_GRP_CD));

		JKKejbKK0081Edit kk0081Edit = new JKKejbKK0081Edit();
		HashMap<String, String> chgMans100MRetMap = kk0081Edit.getMans100MPcrsCdPplanCd(inCBSMsg);
		if (null == chgMans100MRetMap)
		{
			kk0081ETMsg.set(KK0081ETMsg.PCRS_CD, inCBSMsg.getString(EKK0081C100CBSMsg.PCRS_CD));
			kk0081ETMsg.set(KK0081ETMsg.PPLAN_CD, inCBSMsg.getString(EKK0081C100CBSMsg.PPLAN_CD));
		}
		else
		{
			kk0081ETMsg.set(KK0081ETMsg.PCRS_CD, chgMans100MRetMap.get(KK0081ETMsg.PCRS_CD));
			kk0081ETMsg.set(KK0081ETMsg.PPLAN_CD, chgMans100MRetMap.get(KK0081ETMsg.PPLAN_CD));
		}
		
		kk0081ETMsg.set(KK0081ETMsg.TK_HOSHIKI_KEI_NO, inCBSMsg.getString(EKK0081C100CBSMsg.TK_HOSHIKI_KEI_NO));
		kk0081ETMsg.set(KK0081ETMsg.PNLTY_HASSEI_CD, inCBSMsg.getString(EKK0081C100CBSMsg.PNLTY_HASSEI_CD));
		kk0081ETMsg.set(KK0081ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0081ETMsg.set(KK0081ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0081ETMsg.set(KK0081ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0081ETMsg.set(KK0081ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		inCBSMsg.set(EKK0081C100CBSMsg.PCRS_CD_O, kk0081ETMsg.getString(KK0081ETMsg.PCRS_CD));
		inCBSMsg.set(EKK0081C100CBSMsg.PPLAN_CD_O, kk0081ETMsg.getString(KK0081ETMsg.PPLAN_CD));

		return kk0081ETMsg;
	}

	/**
	 * <p>
	 * 異動予約に設定するETメッセージを作成します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @return 異動予約に設定する内容が設定されたETメッセージ
	 */
	private CAANMsg makeKK1681ETMsg(CAANMsg inCBSMsg)
	{
		String svcKeiNo = inCBSMsg.getString(EKK0081C100CBSMsg.SVC_KEI_NO);

		// 異動予約のETメッセージ
		CAANMsg kk1681ETMsg = new CAANMsg(KK1681ETMsg.class.getName());
		kk1681ETMsg.set(KK1681ETMsg.IDO_RSV_NO, getIdoRsvNo(svcKeiNo));
		kk1681ETMsg.set(KK1681ETMsg.MSKM_DTL_NO , inCBSMsg.getString(EKK0081C100CBSMsg.MSKM_DTL_NO));
		kk1681ETMsg.set(KK1681ETMsg.NEW_PRC_GRP_CD , inCBSMsg.getString(EKK0081C100CBSMsg.PRC_GRP_CD));

		JKKejbKK0081Edit kk0081Edit = new JKKejbKK0081Edit();
		HashMap<String, String> chgMans100MRetMap = kk0081Edit.getMans100MPcrsCdPplanCd(inCBSMsg);
		if (null == chgMans100MRetMap)
		{
			kk1681ETMsg.set(KK1681ETMsg.NEW_PCRS_CD, inCBSMsg.getString(EKK0081C100CBSMsg.PCRS_CD));
			kk1681ETMsg.set(KK1681ETMsg.NEW_PPLAN_CD, inCBSMsg.getString(EKK0081C100CBSMsg.PPLAN_CD));
		}
		else
		{
			kk1681ETMsg.set(KK1681ETMsg.NEW_PCRS_CD, chgMans100MRetMap.get(KK0081ETMsg.PCRS_CD));
			kk1681ETMsg.set(KK1681ETMsg.NEW_PPLAN_CD, chgMans100MRetMap.get(KK0081ETMsg.PPLAN_CD));
		}
		kk1681ETMsg.set(KK1681ETMsg.NEW_TK_HOSHIKI_KEI_NO , inCBSMsg.getString(EKK0081C100CBSMsg.TK_HOSHIKI_KEI_NO));
		kk1681ETMsg.set(KK1681ETMsg.PNLTY_HASSEI_CD , inCBSMsg.getString(EKK0081C100CBSMsg.PNLTY_HASSEI_CD));
		kk1681ETMsg.set(KK1681ETMsg.UPD_DTM , inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk1681ETMsg.set(KK1681ETMsg.UPD_OPEACNT , inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		inCBSMsg.set(EKK0081C100CBSMsg.PCRS_CD_O, kk1681ETMsg.getString(KK1681ETMsg.NEW_PCRS_CD));
		inCBSMsg.set(EKK0081C100CBSMsg.PPLAN_CD_O, kk1681ETMsg.getString(KK1681ETMsg.NEW_PPLAN_CD));

		return kk1681ETMsg;
	}
	
	/**
	 * <p>
	 * CBSメッセージの出力項目に値を設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inETMsg DBに設定した内容を持っているETメッセージ
	 */
	private void setOutputItem(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		inCBSMsg.set(EKK0081C100CBSMsg.UPD_DTM, inETMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inCBSMsg.set(EKK0081C100CBSMsg.UPD_OPEACNT, inETMsg.getString(JCMConstants.OPERATOR_ID_KEY));
	}

	/**
	 * <p>
	 * サービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return サービス契約のカレントレコード
	 */
	private CAANMsg getCurSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String svcKeiNo = inCBSMsg.getString(EKK0081C100CBSMsg.SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		CAANMsg cond = new CAANMsg(KK0081ETMsg.class.getName());
		cond.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		cond.set(KK0081ETMsg.RSV_APLY_YMD, opeDate);
		
		// サービス契約のカレントレコード検索
		return new JKKejbKK0081DBABase().findByCurrent(cond);
	}
}
