/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0361C050KRCK
*   ソースファイル名：JEKK0361C050KRCK.java
*   作成者          ：富士通
*   日付            ：2013年05月30日
*＜機能概要＞
*   オプションサービス契約<ISP>開始の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v4.00.00    2013/05/30  富士通      新規作成
*
**********************************************************************/

package eo.ejb.common.entity;

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.cbs.cbsmsg.EKK0361C050CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0351DBABase;

/**
 * <p>
 * オプションサービス契約<ISP>開始の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0361C050KRCK
{
	/** 関連チェックエラーフラグ&エラー返却項目(URL 必須チェック) */
	private static final String[] KRCK_URL_DOMAIN_ERR = {"EA", EKK0361C050CBSMsg.URL_DOMAIN_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(オプション契約上限チェック) */
	private static final String[] KRCK_MLTISE_SESSION_CNT_ERR = {"EA", EKK0361C050CBSMsg.MLTISE_SESSION_CNT_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(メールアドレスのエイジングチェック) */
	private static final String[] KRCK_AGING_MLAD_ERR = {"EB", EKK0361C050CBSMsg.MLAD_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(URLのエイジングチェック) */
	private static final String[] KRCK_AGING_URL_DOMAIN_ERR = {"EB", EKK0361C050CBSMsg.URL_DOMAIN_ERR};
	
	/**
	 * <p>
	 * 新しいJEKK0361C050KRCKを作成します。
	 * </p>
	 */
	public JEKK0361C050KRCK()
	{
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>開始の関連制約を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		
		// URL 必須チェック処理
		if (!isNotNullUrl(inCBSMsg, inContext))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_URL_DOMAIN_ERR);
			return;
		}

		// オプション契約上限チェック
		if (!isOptionKeiLimitChk(inCBSMsg, inContext))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_MLTISE_SESSION_CNT_ERR);
			return;
		}

		// 異動区分がオプション引継または住所変更・登録の場合はチェックを行わない
		if (!JKKModelConst.IDO_DIV_OP_HKTGI.equals(inCBSMsg.getString(EKK0361C050CBSMsg.IDO_DIV)) &&
				!JKKModelConst.IDO_DIV_ADCHG_ADD.equals(inCBSMsg.getString(EKK0361C050CBSMsg.IDO_DIV)))
		{
			CAANMsg inETMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
			inETMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0361C050CBSMsg.OP_SVC_KEI_NO));
			inETMsgKK0361.set(KK0361ETMsg.MLAD, inCBSMsg.getString(EKK0361C050CBSMsg.MLAD));
			inETMsgKK0361.set(KK0361ETMsg.URL_DOMAIN, inCBSMsg.getString(EKK0361C050CBSMsg.URL_DOMAIN));
			inETMsgKK0361.set(KK0361ETMsg.URL_ACCOUNT, inCBSMsg.getString(EKK0361C050CBSMsg.URL_ACCOUNT));
			JKKejbZM0111KRCK instance = new JKKejbZM0111KRCK();

			// メールアドレスのエイジングチェック
			if (!instance.isMladAgingChk(inETMsgKK0361, inContext, "2"))
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_AGING_MLAD_ERR);
				return;
			}

			// URLのエイジングチェック
			if (!instance.isUrlAgingChk(inETMsgKK0361, inContext, "2"))
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_AGING_URL_DOMAIN_ERR);
				return;
			}
		}

	}

	/**
	 * <p>
	 * URLの必須チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return URLが全てNullでない場合はtrue。Nullであるものが存在する場合はfalse。
	 */
	private boolean isNotNullUrl(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 異動区分が"00031"（オプション設定）でない場合はtrueを返却する
		if (!JKKModelConst.IDO_DIV_OP_SET.equals(inCBSMsg.getString(EKK0361C050CBSMsg.IDO_DIV)))
		{
			return true;
		}

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0361C050CBSMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = new JKKejbKK0351DBABase().findByCurrent(inETMsgKK0351);

		// 検索結果がnullだった場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// カレントのオプションサービスコードが"B002"（Ｍｙホームページ）でない場合はtrueを返却する
		if (!JKKModelConst.OP_SVC_CD_MY_HP.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}

		// カレントのオプションサービス契約ステータスが"010"（受付済）の場合はtrueを返却する
		if (JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(ret0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT))
				|| JKKModelConst.SVC_KEI_STAT_SHOSA_ZM.equals(ret0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT))
				|| JKKModelConst.SVC_KEI_STAT_CNC_ZM.equals(ret0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
		{
			return true;
		}

		// 「URL(ドメイン)」がnullの場合、エラーフラグを設定してfalseを返却する
		if (inCBSMsg.isNull(EKK0361C050CBSMsg.URL_DOMAIN))
		{
			return false;
		}

		// 「URL(アカウント)」がnullの場合、エラーフラグを設定してfalseを返却する
		if (inCBSMsg.isNull(EKK0361C050CBSMsg.URL_ACCOUNT))
		{
			return false;
		}

		return true;
	}
	
	/**
	 * <p>
	 * オプション契約上限チェック
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true：正常判定 false：異常判定
	 */
	private boolean isOptionKeiLimitChk(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// オプションサービス契約番号が未設定の場合
		if (inCBSMsg == null || inCBSMsg.isNull(EKK0361C050CBSMsg.OP_SVC_KEI_NO))
		{
			return true;
		}

		// マルチセッション用セッション数が未設定の場合
		if (inCBSMsg.isNull(EKK0361C050CBSMsg.MLTISE_SESSION_CNT))
		{
			return true;
		}

		// オプションサービス契約番号をKEYにオプションサービス契約のカレントレコードを取得する
		CAANMsg inETMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0361C050CBSMsg.OP_SVC_KEI_NO));
		inETMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg ret0351 = new JKKejbKK0351DBABase().findByCurrent(inETMsgKK0351);

		// 検索結果が0件の場合はtrueを返却
		if (ret0351 == null)
		{
			return true;
		}

		// 取得されたレコードのオプションサービスコードが"マルチセッション"でない場合
		if (!JKKModelConst.OP_SVC_CD_MLTISE.equals(ret0351.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return true;
		}

		// 入力値のマルチセッション用セッション数を取得する
		int inMltiSesCnt = inCBSMsg.getStringAsInt(EKK0361C050CBSMsg.MLTISE_SESSION_CNT);

		// オプション契約の上限値のチェックの結果を返却する。
		return new JKKejbKRCKCommon().isNotOverLimitOpInCnt(ret0351, inContext, JKKModelConst.OP_SVC_CD_MLTISE, inMltiSesCnt);
	}
	
	/**
	 * <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;
	}

}
