/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEZM0121D010KRCK
*   ソースファイル名：JEZM0121D010.java
*   作成者          ：富士通
*   日付            ：2014年07月10日
*＜機能概要＞
*   電話番号登録の関連チェック処理部品です。
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v9.00.00    2014/07/10  富士通      新規作成
*   v9.00.01	2014/08/06	FJ)横田		OM-2014-0002632
*   v39.00.00	2018/10/29	FJ)寺園		ST-2018-0000043
*	v41.00.00	2019/03/12	FJ中原	【ANK-3604-00-00】光卸住所情報の断面更新方式変更
*	v72.0.0		2024/04/01	FJ)竹内		【ANK-4494-00-00】【eo定期】 双方向番ポ対応
*
**********************************************************************/

package eo.ejb.common.entity;

import java.util.HashMap;

import com.fujitsu.futurity.common.JCCWebAddTrnId;
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.TU0051ETMsg;
import eo.ejb.cbm.entity.TU0051LE;
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.EZM0121D010CBSMsg;
//OM-2014-0002632 ADD START
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKejbCallTypeChecker;
//OM-2014-0002632 ADD END

/**
 * <p>
 * サービス契約サービス開始日変更関連チェック処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEZM0121D010KRCK
{
	
	/** 警告　：WA */
	private static final String INFO_FLG_WA = "WA";
	
	/** エラー：EA */
	private static final String INFO_FLG_EA = "EA";
	
	/** エラー：EB */
	private static final String INFO_FLG_EB = "EB";
	
	/** エラー：EC */
	private static final String INFO_FLG_EC = "EC";
	
	/** エラー：ED */
	private static final String INFO_FLG_ED = "ED";
	
	/** エラー：EE */
	private static final String INFO_FLG_EE = "EE";
	
	//【ANK-4494-00-00】双方向番ポ対応 DEL STRAT
//	/** エラー：EF */
//	private static final String INFO_FLG_EF = "EF";
//	
//	/** エラー：EG */
//	private static final String INFO_FLG_EG = "EG";
//	
//	/** エラー：EH */
//	private static final String INFO_FLG_EH = "EH";
	//【ANK-4494-00-00】双方向番ポ対応 DEL END
	
	/** エラー：EI */
	private static final String INFO_FLG_EI = "EI";
	
	//【ANK-4494-00-00】双方向番ポ対応 ADD STRAT
	/** エラー：EJ */
	private static final String INFO_FLG_EJ = "EJ";
	
	/** エラー：EK */
	private static final String INFO_FLG_EK = "EK";
	
	/** エラー：EL */
	private static final String INFO_FLG_EL = "EL";
	
	/** エラー：EM */
	private static final String INFO_FLG_EM = "EM";
	//【ANK-4494-00-00】双方向番ポ対応 ADD END

	/** コード種別コード：CD00200 */
	private static final String CD_SBT_CD_CD00200 = "CD00200";
	
	/** コード種別コード：CD00203 */
	private static final String CD_SBT_CD_CD00203 = "CD00203";
	
	/** コード種別コード：CD00409 */
	private static final String CD_SBT_CD_CD00409 = "CD00409";
	
	/** コード種別コード：CD00410 */
	private static final String CD_SBT_CD_CD00410 = "CD00410";
	
	/** コード種別コード：CD00411 */
	private static final String CD_SBT_CD_CD00411 = "CD00411";
	// OM-2014-0002632 DEL START
	///** 登録処理ID（"KK"） */
	//private static final String ADD_TRAN_ID_KK = "KK";
	// OM-2014-0002632 DEL END
	/** 無効フラグ（有効） */
	public static final String MK_FLG_YK = "0";
	
	// OM-2014-0002632 ADD START
	/** 画面ID（KK） */
	private static final String INVOKE_GAMEN_ID_KEY_KK = "KK";
	// OM-2014-0002632 ADD END
	// ANK-3604-00-00 ADD START
	/** サービスＩＤ(申込情報登録(卸先事業者)) */
	private static final String SERVICE_ID_KKSV0895 = "KKSV0895";
	// ANK-3604-00-00 ADD END

	/**
	 * コンストラクタです。
	 */
	public JEZM0121D010KRCK()
	{
	}

	/**
	 * <p>
	 * 電話番号登録関連チェック処理
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		
		// 電話番号存在チェック
		if (!inCBSMsg.isNull(EZM0121D010CBSMsg.TELNO))
		{
			// 検索用のメッセージを作成
			CAANMsg inETMsg = new CAANMsg(ZM0121ETMsg.class.getName());
			inETMsg.set(ZM0121ETMsg.TELNO, inCBSMsg.getString(EZM0121D010CBSMsg.TELNO));

			// 電話番号の検索を行う
			CAANMsg retZM0121 = new ZM0121LE().findByPrimaryKey(inETMsg);

			// レコードが存在する場合
			if (retZM0121 != null)
			{
				// OM-2014-0002632 MOD START
				// 登録処理IDが「契約」かを判定（上2桁が"KK"）
				//if(ADD_TRAN_ID_KK.equals(retZM0121.getString(ZM0121ETMsg.ADD_TRN_ID).substring(0,2)))
	            // 呼び出し区分の判定（バックヤード）
				if (JKKejbCallTypeChecker.isCallTypeBackyard(inContext))
				{
					HashMap<String, Object> comMsg = JCCWebAddTrnId.get(JCMConstants.ADD_TRN_ID_MESSAGE_COMMON_MAP);
					// 画面IDの上2桁を取得
					String trnId = ((String)comMsg.get(JCMConstants.INVOKE_GAMEN_ID_KEY));
					
					if (null == trnId || "".equals(trnId))
					{
						// エラー（"EA"）を設定
						inCBSMsg.set(EZM0121D010CBSMsg.TELNO_ERR, INFO_FLG_EA);
						inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
						return;
					}
					else
					{
						if (INVOKE_GAMEN_ID_KEY_KK.equals(trnId.substring(0,2)))
						{
							// ワーニング（"WA"）を設定
							inCBSMsg.set(EZM0121D010CBSMsg.TELNO_ERR, INFO_FLG_WA);
							inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.WARNING);
						}
						else
						{
							// エラー（"EA"）を設定
							inCBSMsg.set(EZM0121D010CBSMsg.TELNO_ERR, INFO_FLG_EA);
							inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
							return;
						}						
					}
		        // OM-2014-0002632 MOD END
				}
				// ANK-3604-00-00 ADD START
	            // 呼び出し区分の判定（API）
				else if (JKKejbCallTypeChecker.isCallTypeApi(inContext))
				{
					HashMap<String, Object> comMsg = JCCWebAddTrnId.get(JCMConstants.ADD_TRN_ID_MESSAGE_COMMON_MAP);
					// 呼び出し元サービスIDを取得
					String serviceId = ((String)comMsg.get(JCMConstants.USECASE_ID_KEY));
					
					if (null == serviceId || "".equals(serviceId))
					{
						// エラー（"EA"）を設定
						inCBSMsg.set(EZM0121D010CBSMsg.TELNO_ERR, INFO_FLG_EA);
						inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
						return;
					}
					else
					{
						// 呼び出し元が申込情報登録(卸先事業者)の場合
						if (SERVICE_ID_KKSV0895.equals(serviceId))
						{
							// ワーニング（"WA"）を設定
							inCBSMsg.set(EZM0121D010CBSMsg.TELNO_ERR, INFO_FLG_WA);
							inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.WARNING);
						}
						else
						{
							// エラー（"EA"）を設定
							inCBSMsg.set(EZM0121D010CBSMsg.TELNO_ERR, INFO_FLG_EA);
							inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
							return;
						}
					}
				}
				// ANK-3604-00-00 ADD END
				else
				{
					// エラー（"EA"）を設定
					inCBSMsg.set(EZM0121D010CBSMsg.TELNO_ERR, INFO_FLG_EA);
					inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
					return;
				}
			}
		}
		
		// コード名称管理存在チェック:EB
		String noCd = inCBSMsg.getString(EZM0121D010CBSMsg.NO_CD); // 番号コード
		if (!JZMejbZM0171CRCK.isExistsPrimaryKey001(inCBSMsg, inContext, CD_SBT_CD_CD00200, noCd))
		{
			inCBSMsg.set(EZM0121D010CBSMsg.NO_CD_ERR, INFO_FLG_EB);
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
			return;
		}
		
		// コード名称管理存在チェック:EC
		String svcDiv = inCBSMsg.getString(EZM0121D010CBSMsg.SVC_DIV); // サービス区分
		if (!JZMejbZM0171CRCK.isExistsPrimaryKey001(inCBSMsg, inContext, CD_SBT_CD_CD00203, svcDiv))
		{
			inCBSMsg.set(EZM0121D010CBSMsg.SVC_DIV_ERR, INFO_FLG_EC);
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
			return;
		}
		
		// コード名称管理存在チェック:ED
		// 引当制約種別コードが設定されている場合、対象とする
		if (!inCBSMsg.isNull(EZM0121D010CBSMsg.HKAT_SIYK_SBT_CD))
		{
			String hkatSiykSbtCd = inCBSMsg.getString(EZM0121D010CBSMsg.HKAT_SIYK_SBT_CD); // 引当制約種別コード
			if (!JZMejbZM0171CRCK.isExistsPrimaryKey001(inCBSMsg, inContext, CD_SBT_CD_CD00409, hkatSiykSbtCd))
			{
				inCBSMsg.set(EZM0121D010CBSMsg.HKAT_SIYK_SBT_CD_ERR, INFO_FLG_ED);
				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
				return;
			}
		}
		
		// コード名称管理存在チェック:EE
		// 個人法人電話番号帯コードが設定されている場合、対象とする
		if (!inCBSMsg.isNull(EZM0121D010CBSMsg.KOJIN_HOJIN_TLN_TAI_CD))
		{
			String kojinHojinTlnTaiCd = inCBSMsg.getString(EZM0121D010CBSMsg.KOJIN_HOJIN_TLN_TAI_CD); // 個人法人電話番号帯コード
			if (!JZMejbZM0171CRCK.isExistsPrimaryKey001(inCBSMsg, inContext, CD_SBT_CD_CD00410, kojinHojinTlnTaiCd))
			{
				inCBSMsg.set(EZM0121D010CBSMsg.KOJIN_HOJIN_TLN_TAI_CD_ERR, INFO_FLG_EE);
				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
				return;
			}
		}
		
		//【ANK-4494-00-00】双方向番ポ対応 DEL STRAT
		// コード名称管理存在チェック:EF
		// Ｃ５サーバ号機識別コードが設定されている場合、対象とする
//		if (!inCBSMsg.isNull(EZM0121D010CBSMsg.C5_SERVER_GOKI_SKBT_CD))
//		{
//			String c5ServerGokiSkbtCd = inCBSMsg.getString(EZM0121D010CBSMsg.C5_SERVER_GOKI_SKBT_CD); // Ｃ５サーバ号機識別コード
//			if (!JZMejbZM0171CRCK.isExistsPrimaryKey001(inCBSMsg, inContext, CD_SBT_CD_CD00411, c5ServerGokiSkbtCd))
//			{
//				inCBSMsg.set(EZM0121D010CBSMsg.C5_SERVER_GOKI_SKBT_CD_ERR, INFO_FLG_EF);
//				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
//				return;
//			}
//		}
		
		// 通信事業者存在チェック:EG
//		String wariateTsjgsCd = inCBSMsg.getString(EZM0121D010CBSMsg.WARIATE_TSJGS_CD); // 割当通信事業者コード
		// 割当通信事業者コードが存在するかを判定
//		if (!isExistsTushin(wariateTsjgsCd))
//		{
//			inCBSMsg.set(EZM0121D010CBSMsg.WARIATE_TSJGS_CD_ERR, INFO_FLG_EG);
//			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
//			return;
//		}

		// 通信事業者存在チェック:EH
//		String useTsjgsCd = inCBSMsg.getString(EZM0121D010CBSMsg.USE_TSJGS_CD); // 使用通信事業者コード
		// 使用通信事業者コードが存在するかを判定
//		if (!isExistsTushin(useTsjgsCd))
//		{
//			inCBSMsg.set(EZM0121D010CBSMsg.USE_TSJGS_CD_ERR, INFO_FLG_EH);
//			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
//			return;
//		}
		//【ANK-4494-00-00】双方向番ポ対応 DEL END

		// 局番存在チェック:EI
		// 局番が設定されている場合、対象とする
		if (!inCBSMsg.isNull(EZM0121D010CBSMsg.KYOKU_NO))
		{
// v39.00.00 MOD START
//			String kyokuNo = inCBSMsg.getString(EZM0121D010CBSMsg.KYOKU_NO); // 局番
//			if  (!isExistsKyokuNo(kyokuNo))
//			{
//				inCBSMsg.set(EZM0121D010CBSMsg.KYOKU_NO_ERR, INFO_FLG_EI);
//				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
//				return;
//			}
			// 「呼出先サービスがKKIFE386（KKA182）:申込情報登録連携(新規・追加)(卸先事業者)以外の場合
			if (!JKKModelCommon.isKKA182())
			{
				String kyokuNo = inCBSMsg.getString(EZM0121D010CBSMsg.KYOKU_NO); // 局番
				if  (!isExistsKyokuNo(kyokuNo))
				{
					inCBSMsg.set(EZM0121D010CBSMsg.KYOKU_NO_ERR, INFO_FLG_EI);
					inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
					return;
				}
			}
// v39.00.00 MOD END
		}	
		
		/*【ANK-4494-00-00】双方向番ポ対応 ADD STRAT */
		// コード名称管理存在チェック:EJ
		// 初期個人法人電話番号帯コードが設定されている場合、対象とする
		if (!inCBSMsg.isNull(EZM0121D010CBSMsg.SHK_KOJIN_HOJIN_TLN_TAI_CD))
		{
			String shk_kojinHojinTlnTaiCd = inCBSMsg.getString(EZM0121D010CBSMsg.SHK_KOJIN_HOJIN_TLN_TAI_CD); // 初期個人法人電話番号帯コード
			if (!JZMejbZM0171CRCK.isExistsPrimaryKey001(inCBSMsg, inContext, CD_SBT_CD_CD00410, shk_kojinHojinTlnTaiCd))
			{
				inCBSMsg.set(EZM0121D010CBSMsg.SHK_KOJIN_HOJIN_TLN_TAI_CD_ERR, INFO_FLG_EJ);
				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
				return;
			}
		}
		
		// 通信事業者存在チェック:EK
		// 電話番号取得通信事業者コードが設定されている場合、対象とする
		if (!inCBSMsg.isNull(EZM0121D010CBSMsg.TLN_STKU_TSJGS_CD))
		{
			String tln_stkuTsjgsCd = inCBSMsg.getString(EZM0121D010CBSMsg.TLN_STKU_TSJGS_CD); // 電話番号取得通信事業者コード
			// 電話番号取得通信事業者コードが存在するかを判定
			if (!isExistsTushin(tln_stkuTsjgsCd))
			{
				inCBSMsg.set(EZM0121D010CBSMsg.TLN_STKU_TSJGS_CD_ERR, INFO_FLG_EK);
				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
				return;
			}
		}
		
		// 通信事業者存在チェック:EL
		// 移転元通信事業者コードが設定されている場合、対象とする
		if (!inCBSMsg.isNull(EZM0121D010CBSMsg.ITNM_TSJGS_CD))
		{
			String itnmTsjgsCd = inCBSMsg.getString(EZM0121D010CBSMsg.ITNM_TSJGS_CD); // 移転元通信事業者コード
			// 移転元通信事業者コードが存在するかを判定
			if (!isExistsTushin(itnmTsjgsCd))
			{
				inCBSMsg.set(EZM0121D010CBSMsg.ITNM_TSJGS_CD_ERR, INFO_FLG_EL);
				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
				return;
			}
		}
		
		// 通信事業者存在チェック:EM
		// 移転先通信事業者コードが設定されている場合、対象とする
		if (!inCBSMsg.isNull(EZM0121D010CBSMsg.ITNS_TSJGS_CD))
		{
			String itnsTsjgsCd = inCBSMsg.getString(EZM0121D010CBSMsg.ITNS_TSJGS_CD); // 移転先通信事業者コード
			// 移転先通信事業者コードが存在するかを判定
			if (!isExistsTushin(itnsTsjgsCd))
			{
				inCBSMsg.set(EZM0121D010CBSMsg.ITNS_TSJGS_CD_ERR, INFO_FLG_EM);
				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
				return;
			}
		}
		/*【ANK-4494-00-00】双方向番ポ対応 ADD END */
	}
	
	/**
	 * <p>
	 * 通信事業者存在チェックを行います。
	 * </p>
	 * @param tsjgsCd 通信事業者コード
	 * @return 有効レコードが存在する場合はtrue、存在しない場合はfalse。
	 */
	private boolean isExistsTushin(String tsjgsCd)
	{
		if( tsjgsCd == null || "".equals(tsjgsCd))
		{
			return true;
		}

		// 検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(TU0051ETMsg.class.getName());
		// 事業者コードを設定
		inETMsg.set(TU0051ETMsg.TSJGS_CD, tsjgsCd);
		// 通信事業者の検索を行う
		CAANMsg retTU0151 = new TU0051LE().findByPrimaryKey(inETMsg);

		// 存在しない場合
		if (retTU0151 == null)
		{
			return false;
		}
		
		// 存在する場合
		// 取得結果が有効であるか判定
		if (!MK_FLG_YK.equals(retTU0151.getString(TU0051ETMsg.MK_FLG)))
		{
			// 取得結果が無効
			return false;
		}
		// 取得結果が有効
		return true;
	}
	
	/**
	 * <p>
	 * 局番存在チェックを行います。
	 * </p>
	 * @param kyokuNo 局番
	 * @return 有効レコードが存在する場合はtrue、存在しない場合はfalse。
	 */
	private boolean isExistsKyokuNo(String kyokuNo)
	{
		if( kyokuNo == null || "".equals(kyokuNo))
		{
			return true;
		}

		// 検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(ZM0301ETMsg.class.getName());
		// 局番を設定
		inETMsg.set(ZM0301ETMsg.KYOKU_NO, kyokuNo);	
		// 通信事業者の検索を行う
		CAANMsg retZM0301 = new ZM0301LE().findByPrimaryKey(inETMsg);

		// 存在しない場合
		if (retZM0301 == null)
		{
			return false;
		}
		
		// 存在する場合
		// 取得結果が有効であるか判定
		if (!MK_FLG_YK.equals(retZM0301.getString(ZM0301ETMsg.MK_FLG)))
		{
			// 取得結果が無効
			return false;
		}
		// 取得結果が有効
		return true;
	}
}
