/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbEKK1071C121Edit
 *	ソースファイル名：JKKejbEKK1071C121Edit.java
 *	作成者			：富士通
 *	日付			：2011年07月14日
 *＜機能概要＞
 *	多重登録審査チェック部品クラス
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/07/14	富士通		新規作成
 *
 **********************************************************************/

package eo.ejb.common.edit;

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.CK0011ETMsg;
import eo.ejb.cbm.entity.CK0011LE;
import eo.ejb.cbm.entity.KK1981ETMsg;
import eo.ejb.cbs.cbsmsg.EKK1071C121CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 多重登録審査チェッククラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK1071C121Edit
{
	/** 審査チェック結果 OK */
	private static final String CHECK_OK = "00";

	/** 審査詳細種別コード */
	private static final String JDG_DTL_SBT_CD = "001";

	/** 審査対象画面タブコード */
	private static final String JUDGE_TG_SCREEN_TAB_CD = "03";

	/** 審査対象画面項目コード */
	private static final String JUDGE_TG_SCREEN_KMK_CD = "001";

	/** 審査詳細メッセージID */
	private static final String JDG_DTL_MSG_ID = "EKB7980--I";

	/** 契約者タイプコード マンションオーナー */
	private static final String KEISHA_TYPE_CD_OWNER = "5";

	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK1071C121Edit()
	{
	}

	/**
	 * <p>
	 * 多重登録審査チェック処理を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public Object getTajuAddOkChkRslt(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		//指定した条件で審査詳細実施条件を検索し、エラー結果コードの項目値を行う。
		String errRsltCd = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C121CBSMsg.JDG_JSSI_KINO_SKBT_CD), JDG_DTL_SBT_CD);

		// エラー結果取得コードが取得できなかった場合は処理を行わない
		if (errRsltCd == null || "".equals(errRsltCd))
		{
			return CHECK_OK;
		}

		// 多重登録チェックを行い、該当するレコードが存在した場合
		// 審査詳細に登録して審査結果NGを返却する
		if(!isNotSameCust(inMsg))
		{
			createTajuTorokuCheck(inMsg, inContext, errRsltCd);
			return errRsltCd;
		}

		return CHECK_OK;
	}

	/**
	 * <p>
	 * 多重登録チェックを行います。
	 * </p>
	 * @param inMsg         処理対象のメッセージキャリア
	 * @param custNm        お客様名
	 * @param custKana      お客様カナ名
	 * @param custBirthd    お客様生年月日
	 * @param sysid         ＳＹＳＩＤ
	 * @return お客様の情報が顧客に存在しない場合true。存在する場合false。
	 */
	public boolean isNotSameCust(CAANMsg inMsg)
	{
		// お客様_お客様名とお客様_お客様名カナが両方ともnullの場合は処理を行わない
		if(inMsg.isNull(EKK1071C121CBSMsg.CUST_NM) && inMsg.isNull(EKK1071C121CBSMsg.CUST_KANA))
		{
			return true;
		}

		// SYSIDがnullの場合は処理を行わない
		if(inMsg.isNull(EKK1071C121CBSMsg.SYSID))
		{
			return true;
		}

		// お客様の全件検索メッセージの設定を行う
		CAANMsg inETMsgCK0011 = setMsgCK0011(inMsg);
		
		// お客様の全件検索を行う
		CAANMsg[] retCK0011 = findByConditionCK0011(inETMsgCK0011);

		// レコードが存在しなかった場合はtrueを返却する。
		if (retCK0011.length == 0)
		{
			return true;
		}

		// 取得したレコードの件数分処理を行う
		for (int i = 0; i < retCK0011.length; i++)
		{
			// 取得レコードのSYSIDのうち、契約者タイプコードが"5"（マンションオーナー）以外で、
			// 入力値のSYSIDと異なるものが存在した場合はfalseを返却する
			if (!KEISHA_TYPE_CD_OWNER.equals(retCK0011[i].getString(CK0011ETMsg.KEISHA_TYPE_CD))
					&&!inMsg.getString(EKK1071C121CBSMsg.SYSID).equals(retCK0011[i].getString(CK0011ETMsg.SYSID)))
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * <p>
	 * お客様の全件検索を行う為のメッセージ作成を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return 検索条件が設定されたメッセージ
	 */
	private CAANMsg setMsgCK0011(CAANMsg inMsg)
	{
		// 全件検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(CK0011ETMsg.class.getName());

		// お客様名が設定されていた場合は検索条件に設定する
		if(!inMsg.isNull(EKK1071C121CBSMsg.CUST_NM))
		{
			inETMsg.set(CK0011ETMsg.CUST_NM, inMsg.getString(EKK1071C121CBSMsg.CUST_NM));
		}

		// お客様カナ名が設定されていた場合は検索条件に設定する
		if(!inMsg.isNull(EKK1071C121CBSMsg.CUST_KANA))
		{
			inETMsg.set(CK0011ETMsg.CUST_KANA, inMsg.getString(EKK1071C121CBSMsg.CUST_KANA));
		}

		// お客様生年月日が設定されていた場合は検索条件に設定する
		if(!inMsg.isNull(EKK1071C121CBSMsg.CUST_BIRTHD))
		{
			inETMsg.set(CK0011ETMsg.CUST_BIRTHD, inMsg.getString(EKK1071C121CBSMsg.CUST_BIRTHD));
		}

		// お客様退会年月日にはnullを設定する
		inETMsg.setNull(CK0011ETMsg.CUST_TAIKAI_YMD);

		return inETMsg;

	}

	/**
	 * <p>
	 * お客様の一覧検索を行います。
	 * </p>
	 * 
	 * @param inMsg 検索条件を設定したメッセージ
	 * @return 取得結果のレコード
	 */
	private CAANMsg[] findByConditionCK0011(CAANMsg inMsg)
	{
		CAANMsg[] otETMsg = null;

		try
		{
			otETMsg = new CK0011LE().findByCondition(inMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		return otETMsg;
	}

	/**
	 * <p>
	 * 審査詳細の登録を行う（お客様多重登録チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd　エラー結果コード
	 */
	public void createTajuTorokuCheck(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd)
	{
		//審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());

		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C121CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JDG_DTL_SBT_CD);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JUDGE_TG_SCREEN_TAB_CD);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, JUDGE_TG_SCREEN_KMK_CD);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		inETMsg.set(KK1981ETMsg.JUDGE_JUDGE_RSLT_CD, errRsltCd);
		inETMsg.set(KK1981ETMsg.JDG_DTL_MSG_ID, JDG_DTL_MSG_ID);

		//登録処理の実施
		boolean createFlg = new JKKejbKK1071Edit().createJudgeDtl(inMsg, inETMsg);

		//PKが重複していた場合は関連制約エラーとする
		if(!createFlg)
		{
			inMsg.set(EKK1071C121CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C121CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}
	}	

}