/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0361C040ETDA
*	ソースファイル名：JEKK0361C040ETDA.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.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0361ETMsg;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0361C040CBSMsg;
import eo.ejb.cbs.mainproc.JKKejbIdoRsvUtil;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * オプションサービス契約<ISP>開始の副次処理を行う部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0361C040ETDA
{
	
	/** 予約適用コード 予約確定 */
	private static final String APLYCD_DECIDED = "2";
	
	/** サービスコード インターネット */
	private static final String SVCCD_INTERNET = "01";
	
	/** オプションサービスコード ＳＯＨＯパック１０ */
	private static final String OPCD_SOHO10 = "B005";
	
	/** 無効フラグ 有効 */
	private static final String MKFLG_VALID = "0";
	
	/** サブオプションサービス契約ステータス 締結済 */
	private static final String SBOPSTAT_CONCLUDE = "030";
	
	/** 関連チェックエラーフラグ&エラー返却項目(オプションサービス契約 開始日確定チェック) */
	private static final String[] KRCK_OP_START_DECIDED_ERR = {"EB", EKK0361C040CBSMsg.OP_SVC_KEI_NO_ERR};

	/** 相関ルールチェックエラーフラグ&エラー返却項目(異動対象スキーマ判定相関ルール) */
	private static final String[] CORR_IDOJDG = {"EA", EKK0361C040CBSMsg.IDO_DIV_ERR};
	
	/**
	 * <p>
	 * オプションサービス契約<ISP>開始のDBアクセスを行います。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// オプションサービス契約ETDA生成
		JKKejbKK0351ETDA opEtda = new JKKejbKK0351ETDA();
		
		String opSvcKeiNo = inCBSMsg.getString(EKK0361C040CBSMsg.OP_SVC_KEI_NO);
		String skjYkgt = inCBSMsg.getString(EKK0361C040CBSMsg.SKJ_YKGT);
		
		// 開始日設定(オプションサービス)相関ルール
		String staYmd = opEtda.execSokanOfStaYmd(inCBSMsg, inContext, opSvcKeiNo, SVCCD_INTERNET, skjYkgt);

		if (null == staYmd)
		{
			// 開始日を取得しなかった場合、関連チェックエラー
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_OP_START_DECIDED_ERR);
			return;
		}
		
		// 異動対象スキーマ判定相関ルール
		List<HashMap<String, Object>> ruleList = opEtda.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 = opEtda.judgeSchema(inCBSMsg, inContext, ruleList);
		
		if (JKKejbKK0351ETDA.SCHEMAID_OPSVCKEI.equals(targetSchema))
		{
			// オプションサービス契約に振舞う場合
			CAANMsg kk0351Msg = new CAANMsg(KK0351ETMsg.class.getName());
			kk0351Msg.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
			kk0351Msg.set(KK0351ETMsg.IDO_DIV, inCBSMsg.getString(EKK0361C040CBSMsg.IDO_DIV));
// ANK-4427-00-00 ADD START
			kk0351Msg.set(KK0351ETMsg.DSP_SVCTK_STAYMD, inCBSMsg.getString(EKK0361C040CBSMsg.DSP_SVCTK_STAYMD));
// ANK-4427-00-00 ADD END
			// OM-2014-0004052 2015/03/03 ADD START
			String opHktgYmd = inCBSMsg.getString(EKK0361C040CBSMsg.OP_HKTGI_YMD);
			// OM-2014-0004052 2015/03/03 ADD END
			// 課金開始日設定(オプション)相関ルール
			// OM-2014-0004052 2015/03/03 MOD START
//			String chrgStaYmd = opEtda.execSokanOfChrgStaYmd(inCBSMsg, inContext, opSvcKeiNo, skjYkgt, staYmd);
			String chrgStaYmd = opEtda.execSokanOfChrgStaYmd(inCBSMsg, inContext, opSvcKeiNo, skjYkgt, staYmd, opHktgYmd);
			// OM-2014-0004052 2015/03/03 MOD END
			
			if (null == chrgStaYmd)
			{
				// 課金開始日を取得しなかった場合、関連チェックエラー
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_OP_START_DECIDED_ERR);
				return;
			}
			
			// オプションサービス契約登録
			CAANMsg dbInfoOp = opEtda.execDBAccessOpKei(inCBSMsg, inContext, kk0351Msg, staYmd, chrgStaYmd);

			// オプションサービス契約<ISP>登録
			CAANMsg dbInfoSub = execDBAccessOpSub(inCBSMsg, inContext);

			// サブオプションサービス契約に対する副次処理
			new JKKejbKK0401SecProc().updateStart(inCBSMsg, inContext);

			// 出力項目の設定
			setOutputOfOp(inCBSMsg, inContext, dbInfoOp);
			setOutputOfOpSub(inCBSMsg, inContext, dbInfoSub);
		}
		else
		{
			// 上記のスキーマ以外(異動予約)に振舞う場合
			CAANMsg kk1681Msg = new CAANMsg(KK1681ETMsg.class.getName());
			kk1681Msg.set(KK1681ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
			kk1681Msg.set(KK1681ETMsg.IDO_DIV, inCBSMsg.getString(EKK0361C040CBSMsg.IDO_DIV));
			kk1681Msg.set(KK1681ETMsg.OP_HKTGI_SK_SVC_KEI_NO, inCBSMsg.getString(EKK0361C040CBSMsg.OP_HKTGI_SK_SVC_KEI_NO));

			// カレントレコードの取得(オプションサービス契約)
			JKKejbKK0351DBABase kk0351Db = new JKKejbKK0351DBABase();
			CAANMsg inMsg0351 = new CAANMsg(KK0351ETMsg.class.getName());
			inMsg0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
			inMsg0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
			CAANMsg ret0351 = kk0351Db.findByCurrent(inMsg0351);
			
			// 申込明細番号	MSKM_DTL_NO
			kk1681Msg.set(KK1681ETMsg.MSKM_DTL_NO, ret0351.getString(KK0351ETMsg.MSKM_DTL_NO));

			// 異動予約登録
			CAANMsg dbInfoIdoRsv = opEtda.execDBAccessIdoRsv(inCBSMsg, inContext, kk1681Msg, staYmd, null, ruleList.get(0));

			// 出力項目の設定
			setOutputOfIdoRsv(inCBSMsg, inContext, dbInfoIdoRsv);

			// 異動予約登録（副次処理）
			CAANMsg[] secMsgs = new JKKejbKK0401SecProc().getStartIdoDiv(inCBSMsg, inContext);
			if (null != secMsgs)
			{
				for (CAANMsg updMsg: secMsgs)
				{
					// サブオプションサービス契約ステータスが、締結済のもののみ対象とする
					if (SBOPSTAT_CONCLUDE.equals(updMsg.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT)))
					{
						opEtda.execDBAccessIdoRsvSec(inCBSMsg, inContext, updMsg, ruleList.get(0));
					}
				}
			}
		}
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のDBアクセスを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return オプションサービス契約<ISP>の登録内容
	 */
	private CAANMsg execDBAccessOpSub(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 引継元となるオプションサービス契約<ISP>を取得
		String opSvcKeiNo = inCBSMsg.getString(EKK0361C040CBSMsg.OP_SVC_KEI_NO);
		CAANMsg kk0361Cur = getCurOpKeiSub(inCBSMsg, inContext, opSvcKeiNo);
		
		// 登録内容設定
		kk0361Cur.set(KK0361ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0361C040CBSMsg.OP_SVC_KEI_NO));
		kk0361Cur.set(KK0361ETMsg.GENE_ADD_DTM, JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		kk0361Cur.set(KK0361ETMsg.MLTISE_NINSHO_ID, inCBSMsg.getString(EKK0361C040CBSMsg.MLTISE_NINSHO_ID));
		kk0361Cur.set(KK0361ETMsg.MLTISE_NINSHO_ID_PWD, inCBSMsg.getString(EKK0361C040CBSMsg.MLTISE_NINSHO_ID_PWD));
		kk0361Cur.set(KK0361ETMsg.KOTEI_IP_AD, inCBSMsg.getString(EKK0361C040CBSMsg.KOTEI_IP_AD));
		kk0361Cur.set(KK0361ETMsg.NETMASK, inCBSMsg.getString(EKK0361C040CBSMsg.NETMASK));
		kk0361Cur.set(KK0361ETMsg.MLAD, inCBSMsg.getString(EKK0361C040CBSMsg.MLAD));
		kk0361Cur.set(KK0361ETMsg.CAPA, inCBSMsg.getString(EKK0361C040CBSMsg.CAPA));
		
		if (JKKModelCommon.isChkOpSvcCdKK0351(inCBSMsg, inContext, opSvcKeiNo, OPCD_SOHO10))
		{
			// オプションサービスコードが"SOHOパック10"の場合に採番する項目を設定
			kk0361Cur.set(KK0361ETMsg.HOSML_KRISHA_ID, JKKModelCommon.getHosmlKrishaIdKK0361(inCBSMsg, inContext));
			kk0361Cur.set(KK0361ETMsg.HOSTING_SHKM_KRISHA_ID_PWD, JKKModelCommon.getHostingShkmKrishaIdPwdKK0361(inCBSMsg, inContext));
			kk0361Cur.set(KK0361ETMsg.HOSML_KRISHA_POP_ID, JKKModelCommon.getHosmlKrishaPopIdKK0361(inCBSMsg, inContext));
			kk0361Cur.set(KK0361ETMsg.HOS_SHKM_KRISHA_POP_ID_PWD, JKKModelCommon.getHostingShkmKrishaPopPwdKK0361(inCBSMsg, inContext));
		}
		
		kk0361Cur.set(KK0361ETMsg.HOSML_KRISHA_MLAD, inCBSMsg.getString(EKK0361C040CBSMsg.HOSML_KRISHA_MLAD));
		kk0361Cur.set(KK0361ETMsg.HOSML_KRISHA_MAIL_BOX_CAPA, inCBSMsg.getString(EKK0361C040CBSMsg.HOSML_KRISHA_MAIL_BOX_CAPA));
		kk0361Cur.set(KK0361ETMsg.DPAD_MLAD, inCBSMsg.getString(EKK0361C040CBSMsg.DPAD_MLAD));
		kk0361Cur.set(KK0361ETMsg.VOIP_USER_ID, inCBSMsg.getString(EKK0361C040CBSMsg.VOIP_USER_ID));
		kk0361Cur.set(KK0361ETMsg.VOIP_TELNO, inCBSMsg.getString(EKK0361C040CBSMsg.VOIP_TELNO));
		kk0361Cur.set(KK0361ETMsg.MAIL_GW_KRISHA_ID, inCBSMsg.getString(EKK0361C040CBSMsg.MAIL_GW_KRISHA_ID));
		kk0361Cur.set(KK0361ETMsg.MAIL_GW_KRISHA_ID_PWD, inCBSMsg.getString(EKK0361C040CBSMsg.MAIL_GW_KRISHA_ID_PWD));
		kk0361Cur.set(KK0361ETMsg.MAIL_GW_KRISHA_MLAD, inCBSMsg.getString(EKK0361C040CBSMsg.MAIL_GW_KRISHA_MLAD));
		kk0361Cur.set(KK0361ETMsg.MAIL_GW_RCV_MSERVER_IP_AD, inCBSMsg.getString(EKK0361C040CBSMsg.MAIL_GW_RCV_MSERVER_IP_AD));
		kk0361Cur.set(KK0361ETMsg.MAIL_GW_SEND_MSERVER_IP_AD, inCBSMsg.getString(EKK0361C040CBSMsg.MAIL_GW_SEND_MSERVER_IP_AD));
		kk0361Cur.set(KK0361ETMsg.ML_GW_ACCOUNT_CNT, inCBSMsg.getString(EKK0361C040CBSMsg.ML_GW_ACCOUNT_CNT));
		kk0361Cur.set(KK0361ETMsg.KOSHUMO_TELNO, inCBSMsg.getString(EKK0361C040CBSMsg.KOSHUMO_TELNO));
		kk0361Cur.set(KK0361ETMsg.RSV_APLY_CD, APLYCD_DECIDED);
		kk0361Cur.set(KK0361ETMsg.IPV6_AD_IFID, inCBSMsg.getString(EKK0361C040CBSMsg.IPV6_AD_IFID));
		kk0361Cur.set(KK0361ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0361Cur.set(KK0361ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0361Cur.set(KK0361ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0361Cur.set(KK0361ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0361Cur.setNull(KK0361ETMsg.DEL_DTM);
		kk0361Cur.setNull(KK0361ETMsg.DEL_OPEACNT);
		kk0361Cur.set(KK0361ETMsg.MK_FLG, MKFLG_VALID);
		
		createKK0361(inCBSMsg, inContext, kk0361Cur);
		
		return kk0361Cur;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約<ISP>のカレントレコード
	 */
	private CAANMsg getCurOpKeiSub(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		CAANMsg kk0361Cond = new CAANMsg(KK0361ETMsg.class.getName());
		kk0361Cond.set(KK0361ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		
		return new JKKejbKK0361DBABase().findByCurrent(kk0361Cond);
	}
	
	/**
	 * <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 kk0361Msg　オプションサービス契約<ISP>のETメッセージ
	 */
	private void createKK0361(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0361Msg)
	{
		JKKejbDBAUtil dbaU = new JKKejbDBAUtil(inCBSMsg);
		dbaU.create(kk0361Msg);
	}

	/**
	 * <p>
	 * オプションサービス契約の登録内容でCBSメッセージに出力項目を設定します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0351Msg　オプションサービス契約のETメッセージ
	 */
	private void setOutputOfOp(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0351Msg)
	{
		inCBSMsg.set(EKK0361C040CBSMsg.KK0351_GENE_ADD_DTM, kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));
		inCBSMsg.set(EKK0361C040CBSMsg.OP_SVC_KEI_STAT, kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_STAT));
		inCBSMsg.set(EKK0361C040CBSMsg.RSV_APLY_YMD, kk0351Msg.getString(KK0351ETMsg.RSV_APLY_YMD));
		inCBSMsg.set(EKK0361C040CBSMsg.RSV_APLY_CD, kk0351Msg.getString(KK0351ETMsg.RSV_APLY_CD));
		inCBSMsg.set(EKK0361C040CBSMsg.PLAN_STAYMD, kk0351Msg.getString(KK0351ETMsg.PLAN_STAYMD));
		inCBSMsg.set(EKK0361C040CBSMsg.PLAN_ENDYMD, kk0351Msg.getString(KK0351ETMsg.PLAN_ENDYMD));
		inCBSMsg.set(EKK0361C040CBSMsg.PLAN_CHRG_STAYMD, kk0351Msg.getString(KK0351ETMsg.PLAN_CHRG_STAYMD));
		inCBSMsg.set(EKK0361C040CBSMsg.PLAN_CHRG_ENDYMD, kk0351Msg.getString(KK0351ETMsg.PLAN_CHRG_ENDYMD));
		inCBSMsg.set(EKK0361C040CBSMsg.SVC_STAYMD, kk0351Msg.getString(KK0351ETMsg.SVC_STAYMD));
		inCBSMsg.set(EKK0361C040CBSMsg.SVC_CHRG_STAYMD, kk0351Msg.getString(KK0351ETMsg.SVC_CHRG_STAYMD));
		inCBSMsg.set(EKK0361C040CBSMsg.SVC_ENDYMD, kk0351Msg.getString(KK0351ETMsg.SVC_ENDYMD));
		inCBSMsg.set(EKK0361C040CBSMsg.SVC_CHRG_ENDYMD, kk0351Msg.getString(KK0351ETMsg.SVC_CHRG_ENDYMD));
		inCBSMsg.set(EKK0361C040CBSMsg.ADD_DTM, kk0351Msg.getString(KK0351ETMsg.ADD_DTM));
		inCBSMsg.set(EKK0361C040CBSMsg.ADD_OPEACNT, kk0351Msg.getString(KK0351ETMsg.ADD_OPEACNT));
		inCBSMsg.set(EKK0361C040CBSMsg.UPD_DTM, kk0351Msg.getString(KK0351ETMsg.UPD_DTM));
		inCBSMsg.set(EKK0361C040CBSMsg.UPD_OPEACNT, kk0351Msg.getString(KK0351ETMsg.UPD_OPEACNT));
		inCBSMsg.set(EKK0361C040CBSMsg.MK_FLG, kk0351Msg.getString(KK0351ETMsg.MK_FLG));
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>の登録内容でCBSメッセージに出力項目を設定します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0361Msg　オプションサービス契約<ISP>のETメッセージ
	 */
	private void setOutputOfOpSub(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0361Msg)
	{
		inCBSMsg.set(EKK0361C040CBSMsg.KK0361_GENE_ADD_DTM, kk0361Msg.getString(KK0361ETMsg.GENE_ADD_DTM));
		inCBSMsg.set(EKK0361C040CBSMsg.HOSML_KRISHA_ID, kk0361Msg.getString(KK0361ETMsg.HOSML_KRISHA_ID));
		inCBSMsg.set(EKK0361C040CBSMsg.HOSTING_SHKM_KRISHA_ID_PWD, kk0361Msg.getString(KK0361ETMsg.HOSTING_SHKM_KRISHA_ID_PWD));
		inCBSMsg.set(EKK0361C040CBSMsg.HOSML_KRISHA_POP_ID, kk0361Msg.getString(KK0361ETMsg.HOSML_KRISHA_POP_ID));
		inCBSMsg.set(EKK0361C040CBSMsg.HOS_SHKM_KRISHA_POP_ID_PWD, kk0361Msg.getString(KK0361ETMsg.HOS_SHKM_KRISHA_POP_ID_PWD));
	}

	/**
	 * <p>
	 * 異動予約の登録内容でCBSメッセージに出力項目を設定します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk1681Msg 異動予約のETメッセージ
	 */
	private void setOutputOfIdoRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk1681Msg)
	{
		inCBSMsg.set(EKK0361C040CBSMsg.ADD_DTM, kk1681Msg.getString(KK1681ETMsg.ADD_DTM));
		inCBSMsg.set(EKK0361C040CBSMsg.ADD_OPEACNT, kk1681Msg.getString(KK1681ETMsg.ADD_OPEACNT));
		inCBSMsg.set(EKK0361C040CBSMsg.UPD_DTM, kk1681Msg.getString(KK1681ETMsg.UPD_DTM));
		inCBSMsg.set(EKK0361C040CBSMsg.UPD_OPEACNT, kk1681Msg.getString(KK1681ETMsg.UPD_OPEACNT));
		inCBSMsg.set(EKK0361C040CBSMsg.MK_FLG, kk1681Msg.getString(KK1681ETMsg.MK_FLG));
	}

}
