/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0411C050ETDA
*	ソースファイル名：JEKK0411C050ETDA.java
*	作成者			：富士通
*	日付			：2011年10月06日
*＜機能概要＞
*	サブオプションサービス契約<ISP>使用開始時の副次処理を行う部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/06	富士通		新規作成
*	v12.00.00	2015/01/30	FJ)川島		【OM-2014-0004052】
*	v73.00.00	2024/09/26	FJ)謝		【ANK-4427-00-00】NTT卸対応
**********************************************************************/

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.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0411ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0411C050CBSMsg;
import eo.ejb.cbs.mainproc.JKKejbIdoRsvUtil;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * サブオプションサービス契約<ISP>使用開始の副次処理を行う部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0411C050ETDA
{
	
	/** 予約適用コード 予約確定 */
	private static final String APLYCD_DECIDED = "2";
	
	/** 無効フラグ 有効 */
	private static final String MKFLG_VALID = "0";
	
	/** 関連チェックエラーフラグ&エラー返却項目(サブオプションサービス契約 開始日確定チェック) */
	private static final String[] KRCK_SBOP_START_DECIDED_ERR = {"EB", EKK0411C050CBSMsg.SBOP_SVC_KEI_NO_ERR};

	/** 相関ルールチェックエラーフラグ&エラー返却項目(異動対象スキーマ判定相関ルール) */
	private static final String[] CORR_IDOJDG = {"EA", EKK0411C050CBSMsg.IDO_DIV_ERR};
	
	/**
	 * <p>
	 * サブオプションサービス契約<ISP>使用開始のDBアクセスを行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// サブオプションサービス契約ETDA生成
		JKKejbKK0401ETDA sbopEtda = new JKKejbKK0401ETDA();
		
		String opSvcKeiNo = inCBSMsg.getString(EKK0411C050CBSMsg.OP_SVC_KEI_NO);
		String sbopSvcKeiNo = inCBSMsg.getString(EKK0411C050CBSMsg.SBOP_SVC_KEI_NO);
		String skjYkgt = inCBSMsg.getString(EKK0411C050CBSMsg.SKJ_YKGT);
		
		// 開始日設定(サブオプションサービス)相関ルール
		String staYmd = sbopEtda.execSokanOfStaYmd(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo, skjYkgt);

		if (null == staYmd)
		{
			// 開始日を取得しなかった場合、関連チェックエラー
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SBOP_START_DECIDED_ERR);
			return;
		}
				
		// 異動対象スキーマ判定相関ルール
		List<HashMap<String, Object>> ruleList = sbopEtda.execSokanOfIdoJdg(inCBSMsg, inContext, staYmd);

		if (ruleList == null)
		{
			// 異動対象スキーマ判定相関ルールの結果が0件の場合は相関ルールチェックエラー
			setErrInfo(inCBSMsg, StatusCodes.TEMPLATE_CORRELATION_ERR, CORR_IDOJDG);
			return;
		}
		
		// 相関ルールチェック結果を格納
		new JKKejbIdoRsvUtil().setOnlyIdoRsvFlg(inCBSMsg, inContext, ruleList);

		String targetSchema = sbopEtda.judgeSchema(inCBSMsg, inContext, ruleList);
		
		if (JKKejbKK0401ETDA.SCHEMAID_SBOPSVCKEI.equals(targetSchema))
		{
			// サブオプションサービス契約に振舞う場合
			CAANMsg kk0401Msg = new CAANMsg(KK0401ETMsg.class.getName());
			kk0401Msg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
			kk0401Msg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
			kk0401Msg.set(KK0401ETMsg.IDO_DIV, inCBSMsg.getString(EKK0411C050CBSMsg.IDO_DIV));
// ANK-4427-00-00 ADD START
			kk0401Msg.set(KK0401ETMsg.DSP_SVCTK_STAYMD, inCBSMsg.getString(EKK0411C050CBSMsg.DSP_SVCTK_STAYMD));
// ANK-4427-00-00 ADD END
			// OM-2014-0004052 2015/03/03 ADD START
			String opHktgYmd = inCBSMsg.getString(EKK0411C050CBSMsg.OP_HKTGI_YMD);
			// OM-2014-0004052 2015/03/03 ADD END
			// OM-2014-0004052 2015/03/03 MOD START
			// 課金開始日設定(オプション)相関ルール
//			String chrgStaYmd = sbopEtda.execSokanOfChrgStaYmd(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo, skjYkgt, staYmd);
			String chrgStaYmd = sbopEtda.execSokanOfChrgStaYmd(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo, skjYkgt, staYmd, opHktgYmd);
			// OM-2014-0004052 2015/03/03 MOD END
			
			if (null == chrgStaYmd)
			{
				// 課金開始日を取得しなかった場合、関連チェックエラー
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SBOP_START_DECIDED_ERR);
				return;
			}

			// サブオプションサービス契約登録
			CAANMsg dbInfoOp = sbopEtda.execDBAccessSbopKei(inCBSMsg, inContext, kk0401Msg, staYmd, chrgStaYmd);

			// サブオプションサービス契約<ISP>登録
			CAANMsg dbInfoSub = execDBAccessSbopSub(inCBSMsg, inContext);
			
			// 出力項目の設定
			setOutputOfSbop(inCBSMsg, inContext, dbInfoOp);
			setOutputOfSbopSub(inCBSMsg, inContext, dbInfoSub);
		}
		else
		{
			// 上記のスキーマ以外(異動予約)に振舞う場合
			CAANMsg kk1681Msg = new CAANMsg(KK1681ETMsg.class.getName());
			kk1681Msg.set(KK1681ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
			kk1681Msg.set(KK1681ETMsg.IDO_DIV, inCBSMsg.getString(EKK0411C050CBSMsg.IDO_DIV));
			kk1681Msg.set(KK1681ETMsg.OP_HKTGI_SK_SVC_KEI_NO, inCBSMsg.getString(EKK0411C050CBSMsg.OP_HKTGI_SK_SVC_KEI_NO));
			
			// 異動予約登録
			CAANMsg dbInfoIdoRsv = sbopEtda.execDBAccessIdoRsv(inCBSMsg, inContext, kk1681Msg, staYmd, null, ruleList.get(0), opSvcKeiNo);

			// 出力項目の設定
			setOutputOfIdoRsv(inCBSMsg, inContext, dbInfoIdoRsv);
		}
	}

	/**
	 * <p>
	 * サブオプションサービス契約<ISP>のDBアクセスを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return オプションサービス契約<ISP>の登録内容
	 */
	private CAANMsg execDBAccessSbopSub(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 引継元となるオプションサービス契約<ISP>を取得
		String opSvcKeiNo = inCBSMsg.getString(EKK0411C050CBSMsg.OP_SVC_KEI_NO);
		String sbopSvcKeiNo = inCBSMsg.getString(EKK0411C050CBSMsg.SBOP_SVC_KEI_NO);
		CAANMsg kk0411Cur = getCurSbopKeiSub(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo);
		
		// 登録内容設定
		kk0411Cur.set(KK0411ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0411C050CBSMsg.OP_SVC_KEI_NO));
		kk0411Cur.set(KK0411ETMsg.SBOP_SVC_KEI_NO, inCBSMsg.getString(EKK0411C050CBSMsg.SBOP_SVC_KEI_NO));
		kk0411Cur.set(KK0411ETMsg.GENE_ADD_DTM, JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		
		kk0411Cur.set(KK0411ETMsg.RSV_APLY_CD, APLYCD_DECIDED);
		kk0411Cur.set(KK0411ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0411Cur.set(KK0411ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0411Cur.set(KK0411ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0411Cur.set(KK0411ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0411Cur.setNull(KK0411ETMsg.DEL_DTM);
		kk0411Cur.setNull(KK0411ETMsg.DEL_OPEACNT);
		kk0411Cur.set(KK0411ETMsg.MK_FLG, MKFLG_VALID);
		
		createKK0411(inCBSMsg, inContext, kk0411Cur);
		
		return kk0411Cur;
	}

	/**
	 * <p>
	 * サブオプションサービス契約<ISP>のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcKeiNo サブオプションサービス契約番号
	 * @return サブオプションサービス契約<ISP>のカレントレコード
	 */
	private CAANMsg getCurSbopKeiSub(CAANMsg inCBSMsg, AgentDispatchContext inContext,
										String opSvcKeiNo, String sbopSvcKeiNo)
	{
		CAANMsg kk0411Cond = new CAANMsg(KK0411ETMsg.class.getName());
		kk0411Cond.set(KK0411ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		kk0411Cond.set(KK0411ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		
		return new JKKejbKK0411DBABase().findByCurrent(kk0411Cond);
	}
	
	/**
	 * <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;	
	}
	
	/**
	 * <p>
	 * サブオプションサービス契約<ISP>の登録を行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0411Msg　サブオプションサービス契約<ISP>のETメッセージ
	 */
	private void createKK0411(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0411Msg)
	{
		JKKejbDBAUtil dbaU = new JKKejbDBAUtil(inCBSMsg);
		dbaU.create(kk0411Msg);
	}

	/**
	 * <p>
	 * サブオプションサービス契約の登録内容でCBSメッセージに出力項目を設定します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Msg　サブオプションサービス契約のETメッセージ
	 */
	private void setOutputOfSbop(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Msg)
	{
		inCBSMsg.set(EKK0411C050CBSMsg.KK0401_GENE_ADD_DTM, kk0401Msg.getString(KK0401ETMsg.GENE_ADD_DTM));
		inCBSMsg.set(EKK0411C050CBSMsg.SBOP_SVC_KEI_STAT, kk0401Msg.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT));
		inCBSMsg.set(EKK0411C050CBSMsg.RSV_APLY_YMD, kk0401Msg.getString(KK0401ETMsg.RSV_APLY_YMD));
		inCBSMsg.set(EKK0411C050CBSMsg.RSV_APLY_CD, kk0401Msg.getString(KK0401ETMsg.RSV_APLY_CD));
		inCBSMsg.set(EKK0411C050CBSMsg.PLAN_STAYMD, kk0401Msg.getString(KK0401ETMsg.PLAN_STAYMD));
		inCBSMsg.set(EKK0411C050CBSMsg.PLAN_ENDYMD, kk0401Msg.getString(KK0401ETMsg.PLAN_ENDYMD));
		inCBSMsg.set(EKK0411C050CBSMsg.PLAN_CHRG_STAYMD, kk0401Msg.getString(KK0401ETMsg.PLAN_CHRG_STAYMD));
		inCBSMsg.set(EKK0411C050CBSMsg.PLAN_CHRG_ENDYMD, kk0401Msg.getString(KK0401ETMsg.PLAN_CHRG_ENDYMD));
		inCBSMsg.set(EKK0411C050CBSMsg.SVC_STAYMD, kk0401Msg.getString(KK0401ETMsg.SVC_STAYMD));
		inCBSMsg.set(EKK0411C050CBSMsg.SVC_CHRG_STAYMD, kk0401Msg.getString(KK0401ETMsg.SVC_CHRG_STAYMD));
		inCBSMsg.set(EKK0411C050CBSMsg.SVC_ENDYMD, kk0401Msg.getString(KK0401ETMsg.SVC_ENDYMD));
		inCBSMsg.set(EKK0411C050CBSMsg.SVC_CHRG_ENDYMD, kk0401Msg.getString(KK0401ETMsg.SVC_CHRG_ENDYMD));
		inCBSMsg.set(EKK0411C050CBSMsg.ADD_DTM, kk0401Msg.getString(KK0401ETMsg.ADD_DTM));
		inCBSMsg.set(EKK0411C050CBSMsg.ADD_OPEACNT, kk0401Msg.getString(KK0401ETMsg.ADD_OPEACNT));
		inCBSMsg.set(EKK0411C050CBSMsg.UPD_DTM, kk0401Msg.getString(KK0401ETMsg.UPD_DTM));
		inCBSMsg.set(EKK0411C050CBSMsg.UPD_OPEACNT, kk0401Msg.getString(KK0401ETMsg.UPD_OPEACNT));
		inCBSMsg.set(EKK0411C050CBSMsg.MK_FLG, kk0401Msg.getString(KK0401ETMsg.MK_FLG));
	}

	/**
	 * <p>
	 * サブオプションサービス契約<ISP>の登録内容でCBSメッセージに出力項目を設定します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0411Msg　サブオプションサービス契約<ISP>のETメッセージ
	 */
	private void setOutputOfSbopSub(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0411Msg)
	{
		inCBSMsg.set(EKK0411C050CBSMsg.KK0411_GENE_ADD_DTM, kk0411Msg.getString(KK0411ETMsg.GENE_ADD_DTM));
	}

	/**
	 * <p>
	 * 異動予約の登録内容でCBSメッセージに出力項目を設定します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk1681Msg 異動予約」のETメッセージ
	 */
	private void setOutputOfIdoRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk1681Msg)
	{
		inCBSMsg.set(EKK0411C050CBSMsg.ADD_DTM, kk1681Msg.getString(KK1681ETMsg.ADD_DTM));
		inCBSMsg.set(EKK0411C050CBSMsg.ADD_OPEACNT, kk1681Msg.getString(KK1681ETMsg.ADD_OPEACNT));
		inCBSMsg.set(EKK0411C050CBSMsg.UPD_DTM, kk1681Msg.getString(KK1681ETMsg.UPD_DTM));
		inCBSMsg.set(EKK0411C050CBSMsg.UPD_OPEACNT, kk1681Msg.getString(KK1681ETMsg.UPD_OPEACNT));
		inCBSMsg.set(EKK0411C050CBSMsg.MK_FLG, kk1681Msg.getString(KK1681ETMsg.MK_FLG));
	}

}
