/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbEKK1071C111Edit
*	ソースファイル名：JKKejbEKK1071C111Edit.java
*	作成者			：富士通
*	日付			：2011年07月14日
*＜機能概要＞
*	番ポエリア審査チェック部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/14	富士通		新規作成
*	v4.00.01	2013/04/08	FJ）沖田	IT1-2013-0000551
*	v72.00.00	2024/05/27	FJ）寺田	【ANK-4494-00-00】【eo定期】 双方向番ポ対応
*
**********************************************************************/

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.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK1981ETMsg;
import eo.ejb.cbm.entity.TU0071ETMsg;
import eo.ejb.cbm.entity.TU0071LE;
import eo.ejb.cbm.entity.ZM0091ETMsg;
import eo.ejb.cbm.entity.ZM0091LE;
import eo.ejb.cbm.entity.ZM0121ETMsg;
import eo.ejb.cbm.entity.ZM0121LE;
import eo.ejb.cbm.entity.ZM0301ETMsg;
import eo.ejb.cbm.entity.ZM0301LE;
import eo.ejb.cbs.cbsmsg.EKK1071C111CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1071C111CBSMsg1List;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 番ポエリア審査チェッククラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK1071C111Edit
{

	/** 審査チェック結果 OK */
	private static final String CHECK_OK = "00";

	/** 審査詳細種別コード 番ポエリアマスタ登録チェック */
	private static final String JDG_KINO_SBT_MST = "027";

	/** 審査詳細種別コード 番号区画一致チェック */
	private static final String JDG_KINO_SBT_MATCH = "028";

	/** 審査対象画面項目コード ご住所 */
	private static final String JDG_SCREEN_ADDRESS = "004";

	/** 審査対象画面タブコード 電話１ */
	private static final String JDG_SCREEN_TAB_TEL1 = "08";

	/** 審査対象画面タブコード 電話２ */
	private static final String JDG_SCREEN_TAB_TEL2 = "09";

	/** 審査詳細メッセージID 番ポエリアマスタ登録チェック */
	private static final String JDG_MESSAGE_ID_MST = "EKF0480-TW";

	/** 審査詳細メッセージID 番号区画一致チェック */
	private static final String JDG_MESSAGE_ID_MATCH = "EKF0600-KW";

	/** 番ポ有無 有 */
	private static final String BMP_UM_ARI = "1";

	/** 無効フラグ 有効 */
	private static final String MK_FLG_VALID = "0";

	/** 無効フラグ 無効 */
	private static final String MK_FLG_INVALID = "1";

	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK1071C111Edit()
	{
	}

	/**
	 * <p>
	 * 番ポエリア審査チェック処理を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public Object getBmpAreaOkChkRslt(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 明細取得
		CAANMsg[] list = inMsg.getCAANMsgList(EKK1071C111CBSMsg.EKK1071C111CBSMSG1LIST);

		// 明細がnull、または0件の場合は処理を行わない
		if (list == null || list.length == 0)
		{
			return CHECK_OK;
		}

		// チェック結果の配列を作成する
		String[] checkRslt = new String[2];

		// 番ポエリアマスタ登録チェックを行う
// ANK-4494-00-00 MOD START
//		checkRslt[0] = bmpAreaOkMst(inMsg, inContext);
		// TU0071_番ポ可能エリア対象局番を見るチェックは削除し、チェックOKとする。
		checkRslt[0] = CHECK_OK;
// ANK-4494-00-00 MOD END

		// 番号区画一致チェックを行う
		checkRslt[1] = bmpAreaOkMatch(inMsg, inContext);

		// チェック結果の返却
		return new JKKejbKK1071Edit().getJudgeJudgeRsltCd(checkRslt);
	}

// ANK-4494-00-00 DEL START
//	/**
//	 * <p>
//	 * 番ポエリア審査チェック処理を行う（番ポエリアマスタ登録チェック）。
//	 * </p>
//	 * @param inMsg 処理対象のメッセージキャリア
//	 * @param inContext Agentから渡されたAgentDispatchContext
//	 * @return 審査チェック処理の結果
//	 */
//	public String bmpAreaOkMst(CAANMsg inMsg, AgentDispatchContext inContext)
//	{
//		// 審査チェック処理部品
//		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();
//
//		// 審査詳細実施条件のエラー結果コードを取得する
//		String errRsltCd = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C111CBSMsg.JDG_JSSI_KINO_SKBT_CD), JDG_KINO_SBT_MST);
//
//		// エラー結果取得コードが取得できなかった場合は処理を行わない
//		if (errRsltCd == null || "".equals(errRsltCd))
//		{
//			return CHECK_OK;
//		}
//
//		// 番ポエリアマスタ登録チェックを行う
//		int errIdx = banpoAreaMstAddCheck(inMsg);
//		
//		// チェックエラーの場合は審査詳細に登録してエラー結果コードを返却する
//		if (errIdx >= 0)
//		{
//			createBanpoMst(inMsg, inContext, errRsltCd, errIdx);
//			return errRsltCd;
//		}
//
//		return CHECK_OK;
//	}
// ANK-4494-00-00 DEL END

	/**
	 * <p>
	 * 番ポエリア審査チェック処理を行う（番号区画一致チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public String bmpAreaOkMatch(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 審査詳細実施条件のエラー結果コードを取得する
		String errRsltCd = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C111CBSMsg.JDG_JSSI_KINO_SKBT_CD), JDG_KINO_SBT_MATCH);

		// エラー結果取得コードが取得できなかった場合は処理を行わない
		if (errRsltCd == null || "".equals(errRsltCd))
		{
			return CHECK_OK;
		}

		// サービス契約回線内訳_回線場所住所コードが未設定の場合は処理を行わない
		if (inMsg.isNull(EKK1071C111CBSMsg.KAISEN_PLACE_AD_CD))
		{
			return CHECK_OK;
		}

		// 番号区画一致チェックを行う
		int errIdx = noAreaMatchCheck(inMsg);
		
		// チェックエラーの場合は審査詳細に登録してエラー結果コードを返却する
		if (errIdx >= 0)
		{
			createBanpoMatch(inMsg, inContext, errRsltCd, errIdx);
			return errRsltCd;
		}

		return CHECK_OK;
	}

// ANK-4494-00-00 DEL START
//	/**
//	 * <p>
//	 * 番ポエリアマスタ登録チェックを行います。
//	 * </p>
//	 * @param inMsg 処理対象のメッセージキャリア
//	 * @return チェックエラーが発生した配列の番号（エラーがなかった場合は-1）
//	 */
//	public int banpoAreaMstAddCheck(CAANMsg inMsg)
//	{
//		// 運用日付の取得
//		String opeDate = JKKModelCommon.getOpeDate(inMsg);
//
//		// 明細取得
//		CAANMsg[] list = inMsg.getCAANMsgList(EKK1071C111CBSMsg.EKK1071C111CBSMSG1LIST);
//		
//		// 番ポエリア審査明細数分の処理を繰り返す
//		for (int i = 0; i < list.length; i++)
//		{
//			// 番ポ有無が有以外の場合は次の明細へ
//			if(!BMP_UM_ARI.equals(list[i].getString(EKK1071C111CBSMsg1List.BMP_UM)))
//			{
//				continue;
//			}
//
//			// 電話番号がNullの場合はエラー位置を返却する
//			if(list[i].isNull(EKK1071C111CBSMsg1List.TELNO))
//			{
//				return i;
//			}
//
//			// 番ポ可能エリア対象局番のETメッセージに電話番号の上7桁を設定し一意検索を行う
//			CAANMsg retTU0071 = findByPrimaryKeyTU0071(list[i].getString(EKK1071C111CBSMsg1List.TELNO).substring(0, 7));
//
//			// レコードが存在しない場合、エラー位置を返却する
//			if (retTU0071 == null)
//			{
//				return i;
//			}
//
//			// 無効なレコードだった場合、エラー位置を返却する
//			if (MK_FLG_INVALID.equals(retTU0071.getString(TU0071ETMsg.MK_FLG)))
//			{
//				return i;
//			}
//
//			// 該当レコードが適用範囲外の場合、エラー位置を返却する
//			if (!new JKKejbKK1071Edit().isChtYmdRange(retTU0071.getString(TU0071ETMsg.BMPKNAREA_TGKB_TSTAYMD),
//					retTU0071.getString(TU0071ETMsg.BMPKNAREA_TGKB_TENDYMD), opeDate))
//			{
//				return i;
//			}
//		}
//
//		return -1;
//	}
// ANK-4494-00-00 DEL END

	/**
	 * <p>
	 * 番号区画一致チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return チェックエラーが発生した配列の番号（エラーがなかった場合は-1）
	 */
	public int noAreaMatchCheck(CAANMsg inMsg)
	{
		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// 明細取得
		CAANMsg[] list = inMsg.getCAANMsgList(EKK1071C111CBSMsg.EKK1071C111CBSMSG1LIST);

		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 番ポエリア審査明細数分の処理を繰り返す
		for (int i = 0; i < list.length; i++)
		{
			// 番ポ有無が有以外の場合は次の明細へ
			if(!BMP_UM_ARI.equals(list[i].getString(EKK1071C111CBSMsg1List.BMP_UM)))
			{
				continue;
			}

			// 電話番号がNullの場合、エラー位置を返却する
			if(list[i].isNull(EKK1071C111CBSMsg1List.TELNO))
			{
				return i;
			}
			
			// 局番の検索を行う
			CAANMsg retZM0301 = findByPrimaryKeyZM0301(list[i].getString(EKK1071C111CBSMsg1List.TELNO).substring(0, 6));
			
			// レコードが存在しない場合、エラー位置を返却する
			if (retZM0301 == null)
			{
				return i;
			}

			// 無効なレコードだった場合、エラー位置を返却する
			if (MK_FLG_INVALID.equals(retZM0301.getString(ZM0301ETMsg.MK_FLG)))
			{
				return i;
			}

			// 該当レコードが適用範囲外の場合、エラー位置を返却する
			if(!kk1071.isChtYmdRange(retZM0301.getString(ZM0301ETMsg.KYOKU_NO_TSTAYMD), retZM0301.getString(ZM0301ETMsg.KYOKU_NO_TENDYMD), opeDate))
			{
				return i;
			}

			// 住所対象番号区画の検索を行う
			CAANMsg[] otZM0091Msgs = zM0091Search(inMsg.getString(EKK1071C111CBSMsg.KAISEN_PLACE_AD_CD), retZM0301.getString(ZM0301ETMsg.NO_KUKAKU_CD));

			// レコードが取得できない場合、エラー位置を返却する
			if (otZM0091Msgs.length == 0)
			{
				return i;
			}

			// エラーフラグの設定
			boolean errFlg = true; 

			// 取得したレコードの件数分、処理を行う
			for(int j = 0; j < otZM0091Msgs.length; j++)
			{
				// 適用範囲のレコードを対象とする
				// 住所対象番号区画適用開始年月日 ≦ 運用日付の場合
				if (JPCUtilCommon.isPastDate(otZM0091Msgs[j].getString(ZM0091ETMsg.AD_TG_NO_KUKAKU_TSTAYMD), opeDate, "1"))
				{
					// 住所対象番号区画適用終了年月日 ≧ 運用日付の場合、適用範囲内である
					if (JPCUtilCommon.isFutureDate(otZM0091Msgs[j].getString(ZM0091ETMsg.AD_TG_NO_KUKAKU_TENDYMD), opeDate, "1"))
					{
						errFlg = false;
						break;
					}
				}
			}

			// 明細をチェックした結果、エラーフラグがオンの場合、エラー位置を返却する
			if (errFlg)
			{
				return i;
			}
		}

		return -1;
	}

	/**
	 * <p>
	 * 審査詳細の登録を行います（番ポエリア審査チェック.番ポエリアマスタ登録チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd エラー結果コード
	 * @param errIdx エラー発生明細番号
	 */
	public void createBanpoMst(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, int errIdx)
	{
		// 審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());

		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C111CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JDG_KINO_SBT_MST);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, JDG_SCREEN_ADDRESS);
		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_MST);

		// 明細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(EKK1071C111CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C111CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}

	}

	/**
	 * <p>
	 * 審査詳細の登録を行います（番ポエリア審査チェック.番号区画一致チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd エラー結果コード
	 * @param errIdx エラー発生明細番号
	 */
	public void createBanpoMatch(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, int errIdx)
	{
		// 審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());

		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C111CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JDG_KINO_SBT_MATCH);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, JDG_SCREEN_ADDRESS);
		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_MATCH);

		// 明細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(EKK1071C111CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C111CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}

	}

	/**
	 * <p>
	 * 電話番号の一意検索を行います。
	 * </p>
	 * 
	 * @param  telNo 電話番号
	 * @return 取得結果のレコード
	 */
	private CAANMsg findByPrimaryKeyZM0121(String telNo)
	{
		// 一意検索用のメッセージを作成する
		CAANMsg inETMsg = new CAANMsg(ZM0121ETMsg.class.getName());
		inETMsg.set(ZM0121ETMsg.TELNO, telNo);

		// 一意照会を行い、結果を返却する
		return new ZM0121LE().findByPrimaryKey(inETMsg);
	}

// ANK-4494-00-00 DEL START
//	/**
//	 * <p>
//	 * 番ポ可能エリア対象局番の一意検索を行います。
//	 * </p>
//	 * @param kyokuNo 判定局番
//	 * @return 取得結果のレコード
//	 */
//	private CAANMsg findByPrimaryKeyTU0071(String kyokuNo)
//	{
//		// 一意検索用のメッセージを作成する
//		CAANMsg inETMsg = new CAANMsg(TU0071ETMsg.class.getName());
//		inETMsg.set(TU0071ETMsg.JUDGE_KYOKU_NO, kyokuNo);
//
//		// 一意照会を行い、結果を返却する
//		return new TU0071LE().findByPrimaryKey(inETMsg);
//
//	}
// ANK-4494-00-00 DEL END

	/**
	 * <p>
	 * 局番の一意検索を行います。
	 * </p>
	 * 
	 * @param kyokuNo 局番
	 * @return 取得結果のレコード
	 */
	private CAANMsg findByPrimaryKeyZM0301(String kyokuNo)
	{
		// 一意検索用のメッセージを作成する
		CAANMsg inETMsg = new CAANMsg(ZM0301ETMsg.class.getName());
		inETMsg.set(ZM0301ETMsg.KYOKU_NO, kyokuNo);
		inETMsg.set(ZM0301ETMsg.MK_FLG, MK_FLG_VALID);

		// 一意照会を行い、結果を返却する
		return new ZM0301LE().findByPrimaryKey(inETMsg);
	}

	/**
	 * <p>
	 * 住所対象番号区画の検索を行います。
	 * </p>
	 * 
	 * @param kaisenPlaceAdCd 住所コード
	 * @param noKukakuCd      番号区画コード 
	 * @return 取得結果のレコードを返却
	 */
	private CAANMsg[] zM0091Search(String kaisenPlaceAdCd, String noKukakuCd)
	{
		// 全件検索用のメッセージを作成する
		CAANMsg inETMsg = new CAANMsg(ZM0091ETMsg.class.getName());
		inETMsg.set(ZM0091ETMsg.AD_CD, kaisenPlaceAdCd);
		inETMsg.set(ZM0091ETMsg.NO_KUKAKU_CD, noKukakuCd);
		inETMsg.set(ZM0091ETMsg.MK_FLG, MK_FLG_VALID);

		CAANMsg[] otETMsg = null;
		try
		{
			otETMsg = new ZM0091LE().findByCondition(inETMsg);
		}
		catch (CAANException e1)
		{
			throw new CAANRuntimeException(e1);
		}

		return otETMsg;
	}
}
