/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbEKK1071C081Edit
*	ソースファイル名：JKKejbEKK1071C081Edit.java
*	作成者			：富士通
*	日付			：2011年07月14日
*＜機能概要＞
*	記載不備電話番号情報審査部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/14	富士通		新規作成
*	v4.00.01	2013/01/29	FJ）藤本	ST3-2013-0000169
*	v4.00.02	2013/03/28	FJ）沖田	ST1-2013-0000487
*	v4.00.03	2013/04/08	FJ）沖田	IT1-2013-0000551
*
**********************************************************************/

package eo.ejb.common.edit;

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.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK1981ETMsg;
import eo.ejb.cbs.cbsmsg.EKK1071C081CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1071C081CBSMsg1List;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 記載不備電話番号情報審査クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK1071C081Edit
{

	/** 審査チェック結果 OK */
	private static final String CHECK_OK = "00";

	/** 異動区分 新規契約 */
	private static final String IDO_IDV_NEW = "00001";

	/** 異動区分 サービス追加 */
	private static final String IDO_IDV_ADD = "00002";

	/** 審査詳細種別コード 緊急連絡チェック */
	private static final String JDG_KINO_SBT_EMG = "021";

	/** 審査詳細種別コード 電話番号設定チェック */
	private static final String JDG_KINO_SBT_TEL = "038";

	/** 審査詳細種別コード 番号区画一致チェック */
	private static final String JDG_KINO_SBT_NO_KUKAKU = "028";

	/** 審査詳細種別コード 緊急通報用契約者情報不備チェック */
	private static final String JDG_KINO_SBT_EMG_KSH = "048";

	/** 審査対象画面タブコード 電話１ */
	private static final String JDG_SCREEN_TAB_TEL1 = "08";

	/** 審査対象画面タブコード 電話２ */
	private static final String JDG_SCREEN_TAB_TEL2 = "09";

	/** 審査対象画面項目コード 契約者住所 */
	private static final String JDG_SCREEN_KSH_AD = "008";

	/** 審査対象画面項目コード 電話番号 */
	private static final String JDG_SCREEN_TEL = "010";

	/** 審査詳細メッセージID 緊急連絡チェック */
	private static final String JDG_MESSAGE_ID_EMG = "EKB8050--I";

	/** 審査詳細メッセージID 電話番号設定チェック */
	private static final String JDG_MESSAGE_ID_TEL = "EKB7400-CE";
	
	/** 審査詳細メッセージID 番号区画一致チェック */
	private static final String JDG_MESSAGE_ID_NO_KUKAKU = "EKBD150-KW";

	/** 審査詳細メッセージID 緊急通報用契約者情報不備チェック */
	private static final String JDG_MESSAGE_ID_EMG_KSH = "EKB0030-TW";
	
	/** メッセージ埋め込み */
	private static final String MSG_UMKM_MOJI1 = "電話番号";
	
	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK1071C081Edit()
	{
	}

	/**
	 * <p>
	 * 記載不備電話番号情報審査チェック処理を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public Object getKshbiOkForTelNoInfoChkRslt(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// チェック結果の配列を作成する
		String[] checkRslt = new String[4];

		// 緊急連絡チェック処理を行う
		checkRslt[0] = emgRrskCheck(inMsg, inContext);

		// 電話番号設定チェック処理を行う
		checkRslt[1] = telNoSetCheck(inMsg, inContext);
		
		// 番号区画一致チェック処理を行う
		checkRslt[2] = noKukakuCdCheck(inMsg, inContext);
		
		// 緊急通報用契約者情報不備チェック
		checkRslt[3] = emgKshCheck(inMsg, inContext);
		
		// チェック結果の返却
		return new JKKejbKK1071Edit().getJudgeJudgeRsltCd(checkRslt);
	}

	/**
	 * <p>
	 * 緊急連絡チェック処理を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public String emgRrskCheck(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 異動区分が「新規契約」、「サービス追加」以外の場合は処理を行わない
		String idoDiv = inMsg.getString(EKK1071C081CBSMsg.IDO_DIV);

		if (!IDO_IDV_NEW.equals(idoDiv) && !IDO_IDV_ADD.equals(idoDiv))
		{
			return CHECK_OK;
		}

		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 審査詳細実施条件のエラー結果コードを取得する
		String errRsltCd = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C081CBSMsg.JDG_JSSI_KINO_SKBT_CD), JDG_KINO_SBT_EMG);

		// エラー結果取得コードが取得できなかった場合は処理を行わない
		if (errRsltCd == null || "".equals(errRsltCd))
		{
			return CHECK_OK;
		}

		// 審査チェック処理部品の緊急連絡先チェックを呼び出す
		int errIdx = kk1071.emgRrskCheck(inMsg, inMsg.getCAANMsgList(EKK1071C081CBSMsg.EKK1071C081CBSMSG1LIST));

		// チェック結果にNGが含まれている場合、審査詳細に登録してエラー結果コードを返却する
		if (errIdx >= 0)
		{
			createEmgRrkChk(inMsg, inContext, errRsltCd, errIdx);
			return errRsltCd;
		}

		return CHECK_OK;
	}

	/**
	 * <p>
	 * 電話番号設定チェック処理を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public String telNoSetCheck(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 審査詳細実施条件のエラー結果コードを取得する
		String errRsltCd = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C081CBSMsg.JDG_JSSI_KINO_SKBT_CD), JDG_KINO_SBT_TEL);

		// エラー結果取得コードが取得できなかった場合は処理を行わない
		if (errRsltCd == null || "".equals(errRsltCd))
		{
			return CHECK_OK;
		}

		// 配列を取得
		CAANMsg[] msgList = inMsg.getCAANMsgList(EKK1071C081CBSMsg.EKK1071C081CBSMSG1LIST);

		// エラー位置保持用変数の設定
		int errIdx = -1;

		// 配列の件数分処理を行う
		for (int i = 0; i < msgList.length; i++)
		{
			// 電話番号が未設定の場合はエラー位置を保持して処理を終了する
			if (msgList[i].isNull(EKK1071C081CBSMsg1List.TELNO))
			{
				errIdx = i;
				break;
			}
		}

		// チェック結果にNGが含まれている場合、審査詳細に登録してエラー結果コードを返却する
		if (errIdx >= 0)
		{
			createTelNoChk(inMsg, inContext, errRsltCd, errIdx);
			return errRsltCd;
		}

		return CHECK_OK;
	}

	/**
	 * <p>
	 * 審査詳細の登録を行います（緊急連絡チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd エラー結果コード
	 * @param errIdx エラー発生明細番号
	 */
	public void createEmgRrkChk(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, int errIdx)
	{
		// 審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());

		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C081CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JDG_KINO_SBT_EMG);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, JDG_SCREEN_KSH_AD);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		inETMsg.set(KK1981ETMsg.JUDGE_JUDGE_RSLT_CD, errRsltCd);
		inETMsg.set(KK1981ETMsg.JDG_DTL_MSG_ID, JDG_MESSAGE_ID_EMG);

		// 明細1件目でエラーとなった場合、審査対象画面タブコードに「電話１」を設定する
		if (errIdx == 0)
		{
			inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_TEL1);
		}
		else
		{
			inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_TEL2);
		}

		// 登録処理の実施
		boolean createFlg = new JKKejbKK1071Edit().createJudgeDtl(inMsg, inETMsg);

		// PKが重複していた場合は関連制約エラーとする
		if (!createFlg)
		{
			inMsg.set(EKK1071C081CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C081CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}

	}

	/**
	 * <p>
	 * 審査詳細の登録を行います（電話番号設定チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd エラー結果コード
	 * @param errIdx エラー発生明細番号
	 */
	public void createTelNoChk(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, int errIdx)
	{
		// 審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());

		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C081CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JDG_KINO_SBT_TEL);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, JDG_SCREEN_TEL);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		inETMsg.set(KK1981ETMsg.JUDGE_JUDGE_RSLT_CD, errRsltCd);
		inETMsg.set(KK1981ETMsg.MSG_UMKM_MOJI, MSG_UMKM_MOJI1);
		inETMsg.set(KK1981ETMsg.JDG_DTL_MSG_ID, JDG_MESSAGE_ID_TEL);

		// 明細1件目でエラーとなった場合、審査対象画面タブコードに「電話１」を設定する
		if (errIdx == 0)
		{
			inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_TEL1);
		}
		else
		{
			inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_TEL2);
		}

		// 登録処理の実施
		boolean createFlg = new JKKejbKK1071Edit().createJudgeDtl(inMsg, inETMsg);

		// PKが重複していた場合は関連制約エラーとする
		if (!createFlg)
		{
			inMsg.set(EKK1071C081CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C081CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}

	}

	/**
	 * <p>
	 * 番号区画一致チェック
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public String noKukakuCdCheck(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		CAANMsg[] eKK1071C081CBSMsgList = inMsg.getCAANMsgList(EKK1071C081CBSMsg.EKK1071C081CBSMSG1LIST);

		// 記載不備電話番号情報審査明細がNULLまたは0件の場合はチェックしない
		if (null == eKK1071C081CBSMsgList || eKK1071C081CBSMsgList.length == 0)
		{
			return CHECK_OK;
		}
		
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 審査詳細実施条件のエラー結果コードを取得する
		String errRsltCd = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C081CBSMsg.JDG_JSSI_KINO_SKBT_CD), JDG_KINO_SBT_NO_KUKAKU);

		// エラー結果取得コードが取得できなかった場合は処理を行わない
		if (errRsltCd == null || "".equals(errRsltCd))
		{
			return CHECK_OK;
		}

		// エラー位置保持用変数の設定
		int errIdx = -1;
		
		for (int i = 0; i < eKK1071C081CBSMsgList.length; i ++)
		{
			CAANMsg eKK1071C081CBSMsg = eKK1071C081CBSMsgList[i];
			String telno = eKK1071C081CBSMsg.getString(EKK1071C081CBSMsg1List.TELNO);
			
			if(null == telno || "".equals(telno))
			{
				continue;
			}
			
			String emgAdCd = eKK1071C081CBSMsg.getString(EKK1071C081CBSMsg1List.EMG_AD_CD);
			
			if(null == emgAdCd || "".equals(emgAdCd))
			{
				continue;
			}

			String bmpUm = eKK1071C081CBSMsg.getString(EKK1071C081CBSMsg1List.BMP_UM);
			
			// 審査チェック処理部品の番号区画一致チェックを呼び出す
			if(!kk1071.noKukakuCdCheck(inMsg, telno, emgAdCd, bmpUm))
			{
				errIdx = i;
				break;
			}
			
		}
		// チェック結果にNGが含まれている場合、審査詳細に登録してエラー結果コードを返却する
		if (errIdx >= 0)
		{
			createNoKukakuCdChk(inMsg, inContext, errRsltCd, errIdx);
			return errRsltCd;
		}

		return CHECK_OK;
	}
	
	/**
	 * <p>
	 * 審査詳細の登録を行います（番号区画一致チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd エラー結果コード
	 * @param errIdx エラー発生明細番号
	 */
	public void createNoKukakuCdChk(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, int errIdx)
	{
		// 審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());

		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C081CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JDG_KINO_SBT_NO_KUKAKU);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, JDG_SCREEN_TEL);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		inETMsg.set(KK1981ETMsg.JUDGE_JUDGE_RSLT_CD, errRsltCd);
		inETMsg.set(KK1981ETMsg.JDG_DTL_MSG_ID, JDG_MESSAGE_ID_NO_KUKAKU);

		// 明細1件目でエラーとなった場合、審査対象画面タブコードに「電話１」を設定する
		if (errIdx == 0)
		{
			inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_TEL1);
		}
		else
		{
			inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_TEL2);
		}

		// 登録処理の実施
		boolean createFlg = new JKKejbKK1071Edit().createJudgeDtl(inMsg, inETMsg);

		// PKが重複していた場合は関連制約エラーとする
		if (!createFlg)
		{
			inMsg.set(EKK1071C081CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C081CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}

	}
	
	/**
	 * <p>
	 * 緊急通報用契約者情報不備チェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public String emgKshCheck(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		CAANMsg[] eKK1071C081CBSMsgList = inMsg.getCAANMsgList(EKK1071C081CBSMsg.EKK1071C081CBSMSG1LIST);

		// 記載不備電話番号情報審査明細がNULLまたは0件の場合はチェックしない
		if (null == eKK1071C081CBSMsgList || eKK1071C081CBSMsgList.length == 0)
		{
			return CHECK_OK;
		}
		
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 審査詳細実施条件のエラー結果コードを取得する
		String errRsltCd = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C081CBSMsg.JDG_JSSI_KINO_SKBT_CD), JDG_KINO_SBT_EMG_KSH);

		// エラー結果取得コードが取得できなかった場合は処理を行わない
		if (errRsltCd == null || "".equals(errRsltCd))
		{
			return CHECK_OK;
		}

		// 配列を取得
		CAANMsg[] msgList = inMsg.getCAANMsgList(EKK1071C081CBSMsg.EKK1071C081CBSMSG1LIST);

		// 配列の件数分処理を行う
		for (int i = 0; i < msgList.length; i++)
		{
			// 緊急通報用契約者名または緊急通報用契約者カナ名が未設定の場合
			if (msgList[i].isNull(EKK1071C081CBSMsg1List.EMG_KSH_NM) || msgList[i].isNull(EKK1071C081CBSMsg1List.EMG_KSH_KANA)
					|| "".equals(msgList[i].getString(EKK1071C081CBSMsg1List.EMG_KSH_NM)) || "".equals(msgList[i].getString(EKK1071C081CBSMsg1List.EMG_KSH_KANA)))
			{
				String msgUmkm = "緊急通報用契約者情報";
				createEmgKshChk(inMsg, inContext, errRsltCd, i, JDG_MESSAGE_ID_TEL, msgUmkm);
				return errRsltCd;
			}

			// 緊急通報用契約者名が20桁より大きい場合
			if (msgList[i].getString(EKK1071C081CBSMsg1List.EMG_KSH_NM).length() > 20)
			{
				String msgUmkm = "緊急通報用契約者情報,全角,20";
				createEmgKshChk(inMsg, inContext, errRsltCd, i, JDG_MESSAGE_ID_EMG_KSH, msgUmkm);
				return errRsltCd;
			}
			
			// 緊急通報用契約者名が半角変換後36桁より大きい場合
			if (JPCUtilCommon.convFullToHalfByKata(msgList[i].getString(EKK1071C081CBSMsg1List.EMG_KSH_KANA)).length() > 36)
			{
				String msgUmkm = "緊急通報用契約者カナ名,緊急通報用英数字カナ名,36";
				createEmgKshChk(inMsg, inContext, errRsltCd, i, JDG_MESSAGE_ID_EMG_KSH, msgUmkm);
				return errRsltCd;
			}
		}
		
		return CHECK_OK;
	}
	

	/**
	 * <p>
	 * 審査詳細の登録を行います（緊急通報用契約者情報不備チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd エラー結果コード
	 * @param errIdx エラー発生明細番号
	 */
	public void createEmgKshChk(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, int errIdx, String msgId, String msgUmkmMoji)
	{
		// 審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());

		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C081CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JDG_KINO_SBT_EMG_KSH);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, JDG_SCREEN_TEL);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		inETMsg.set(KK1981ETMsg.JUDGE_JUDGE_RSLT_CD, errRsltCd);
		inETMsg.set(KK1981ETMsg.MSG_UMKM_MOJI, msgUmkmMoji);
		inETMsg.set(KK1981ETMsg.JDG_DTL_MSG_ID, msgId);

		// 明細1件目でエラーとなった場合、審査対象画面タブコードに「電話１」を設定する
		if (errIdx == 0)
		{
			inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_TEL1);
		}
		else
		{
			inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_TEL2);
		}

		// 登録処理の実施
		boolean createFlg = new JKKejbKK1071Edit().createJudgeDtl(inMsg, inETMsg);

		// PKが重複していた場合は関連制約エラーとする
		if (!createFlg)
		{
			inMsg.set(EKK1071C081CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C081CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}
	}
}
